Birkaç dizinde bir sürü .zip dosyası var:
Fol1/Fol2
Fol3
Fol4/Fol5
Hepsini ortak bir klasöre nasıl taşırım?
Birkaç dizinde bir sürü .zip dosyası var:
Fol1/Fol2
Fol3
Fol4/Fol5
Hepsini ortak bir klasöre nasıl taşırım?
Yanıtlar:
Zip dosyalarını ( cd …
) içeren ağacın üst düzey dizinine gidin , sonra çalıştırın
mv **/*.zip /path/to/single/target/directory
Bu, zsh içindeki kutunun dışında çalışır. Eğer kabuğunuz bash ise, önce koşmanız gerekir shopt -s globstar
(bu komutu kendi içine koyabilirsiniz ve koymalısınız ~/.bashrc
). Eğer kabuğunuz ksh ise, önce koşmanız gerekir set -o globstar
(içine koyun ~/.kshrc
).
Alternatif olarak, find
özel bir hazırlık olmadan her yerde çalışan, ancak daha karmaşık olan kullanım:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
Daha sonra boş dizinleri kaldırmak istiyorsanız, zsh cinsinden:
rmdir **/*(/^Fod)
Bash veya ksh cinsinden:
rmdir **/*/
ve kaldırılacak boş dizinler olduğu sürece tekrarlayın. Alternatif olarak, herhangi bir kabukta
find . -depth -type d -empty -exec rmdir {} \;
find
Yukarıdaki ilk komut bash'te işe yaradı, ancak find . -name
çalışmasını sağlamak için vb. Değiştirmek zorunda kaldı .
.
GNU'yu bulmak için örtük ama diğerleri için değil, açıkça ekledim.
Eğer kullanıyorsanız bash sürüm 4 veya daha yüksek veya ZSH da özyinelemeli globbing kullanabilirsiniz:
mv **/*.zip /path/to/move/zip/files/to
Bu SADECE dosyaları taşıyacak, bağıl yolları değil, çarpışmalar ortaya çıkabilir.
Bu, sürümleri ne olursa olsun tüm dağıtıcıların çoğunu destekleyen veri ve hatasız hareket ederken güvenlidir. Bu komut alt dizinleri tarar ve ardından yeni hedef dizininize taşır veya kopyalar.
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
gibi herhangi bir şeye geçebileceğiniz yer *.zip
. Ya da *.doc
sadece herhangi bir eklenti çalışır.mv
dosyaları taşıma komutu ya da taşımak cp
yerine verileri kopyalamak için kullanabilirsiniz ../flac/
tüm FLAC dosyalarını taşımak istediğim hedef dizin. Ayrıca gibi tam bir yol verebilirsiniz/home/myid/flac/
Tam örnek (bu durumda, müzik sanatçısı adında birçok alt dizin vardır /home/myid/Music/
ve sonra FLAC dosyaları farklı alt dizinler düzeyindedir. Çünkü sanatçı klasörlerine ihtiyacım yok, ancak tüm FLAC dosyalarının bir dizinde olmasını istiyorum./home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
Sonra tüm FLAC dosyalarını gösterecektir.
;
mi?
Bir basma kesmek olarak, gücünü kullanabilirsiniz tar
:
(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/
Bu, dosya uzantılarına bağlı olmaması avantajına sahiptir, çünkü file
taşınacak dosyaları seçme komutunu kullanır ve dizin yapısını korur, ancak boşluk içeren yollarla çalışmaz.
Nihai rm
sadece (o yorumunda orijinal klasörde önemsemiyor o @InquilineKea tolds nedeniyle bu derste) orijinal dosyaları kaldırmak için vardır.
Tabii ki, eğer kaynak / ve hedef / klasörler farklı disklerde ise bu özellikle uygundur. Aksi takdirde, önerilen diğer çözümler daha verimlidir ( file
içeriği yerine, adlandırma kurallarına bağlı olsalar bile ).
Bul ve mv'nin GNU sürümlerine sahip olduğunuzu varsayarak, aşağıdakiler mevcut bulmaya dayalı cevaplardan daha verimli olacaktır:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
Bir Kullanarak +
dosyaların bir listesini yerine dosyanın başına bir mv komutu idam etmekten, mv komutuna geçirilen olacağını bulmak -exec araçlarının sonunda buldum. Bununla birlikte, bunun bir sınırlaması sadece '{}' yi komutun sonuna yerleştirebilmenizdir, ki bu da mv --target-directory seçeneğinin kullanılmasını gerektiren ve bunun GNU-ism olduğunu bildiğim kadarıyla.