2013-01-15 26 views
11

numaralı dizindeki bir hedef dizine dönüşümlü olarak taşıma Tüm .txt dosyalarını bir klasörden ve tüm klasörlerden bir hedef dizine nasıl taşıyabilirim.Belirli bir türdeki tüm dosyaları Bash

Ve tercihen, önemli olanları da dahil olmak üzere, dahil oldukları klasöre yeniden adlandırın. Bash'a tam olarak aşina değilim.

cevap

23

Dosyaları art arda taşımak için find'u mv ile birleştirin.

find src/dir/ -name '*.txt' -exec mv {} target/dir/ \; 

Dosyaları taşıdığınızda dosyaları yeniden adlandırmak daha zor olur. Bir yol, her dosya adını eğik çizgileri alt çizgilere dönüştüren tr/_ aracılığıyla geçiren bir döngüye sahip olmaktır.

find src/dir/ -name '*.txt' | while read file; do 
    mv "$file" "target/dir/$(tr/_ <<< "$file")" 
done 
+0

Katıştırılmış yeni satırlar içeren dosyalarla birlikte çalışacak veya boşluklarla başlayabileceğiniz bir sürüm: 'find src/dir -name '* .txt' -exec bash -c 'mv" $ 1 "" $ {1 // \// _} "'_ {}'; '' –

1

sadece bir seviye ise:

mv *.txt */*.txt target/directory/somewhere/. 
11

bu deneyin: Bu singe mv işlemi çağırmak olmaz çünkü

find source -name '*.txt' | xargs -I files mv files target 

Bu, -exec ile herhangi bir seçeneğin daha hızlı çalışacak taşınması gereken her dosya için.

+0

Harika çözüm ve ciddi hızlı ... – Blacklight

+1

Kabul edilen cevaptan çok daha hızlı. Sağlamlık için sıfır sonlu dosya adı dizelerini kullanmanın iyi bir fikir olduğunu unutmayın: 'kaynak-adı bul * * .txt '-print0 | xargs -0 -I dosyaları mv dosyaları hedef ' – cooperised

İlgili konular