Yanıtlar:
Kaldır {}
dan mv
, mv
herhangi bir ana dizinleri görmezden hedef dizin olarak alacaktır:
find -type f -exec mv {} collection/ \;
-maxdepth 1
yardımcı olabilir.
find -type f -print0|xargs -0r mv -it colection/
Kullanmak yerine find
(ki bu işi iyi yapar), bu amaçla kabuğu da kullanabilirsiniz.
$ PWD - $ DEST arasındaki tüm dosyalara istediğinizi varsayalım. Doğal girişim şöyle olur:
mv $PWD/* $DEST
Bu nasıl çalışıyor? "$ PWD / *" ifadesi bu dizindeki tüm dosyaların adlarına genişler. Bu kabuk özelliğine "globbing" denir. Son argümanı mv
hedef dizindir. Çok fazla dosyanız varsa, komut satırının uzunluğu sınırlı olduğu için bu çalışmaz.
Ancak çözüm, nokta dosyalarını - veya adı "." İle başlayan "gizli" dosyaları, dosyaları ve dizinleri atlaması sorununa sahiptir. Bunu çözmek için, kabuğunuza globbing yaparken dotfiles eklemesini söylemelisiniz. Bunu yapmak için şunu kullanın:
shopt -s dotglob
kullanırken bash
(ve muhtemelen bash
varsayılanı değiştirmedikçe kullanırsınız ). Bu kabukta, yukarıdaki komut dotfiles için de çalışır.
Bir yana, zsh
bunu, duruma göre seçme seçeneğiniz vardır. Bunu yapmak için
setopt extendedglob
sizin .zshrc
. Sonra kullanabilirsiniz
mv $PWD/*(D) $DEST
dotfiles dahil tüm dosyaları taşımak için. ("D", "GLOB_DOTS" seçeneğini geçici olarak etkinleştirme etkisine sahiptir).
Şimdi asıl soru, tüm normal dosyaları (dizinleri değil) tüm alt dizinlerden ve alt dizinlerinden tek bir dizine taşımaktı. Bu, aşağıdakilerle gerçekleştirilebilir zsh
:
mv $PWD/**/*(D.)
Burada ifade **/*
, globber'ı alt dizinlere özyinelemeli olarak alçaltır. D
"Ayrıca dotfiles' seçeneğini; vasıta .
araçlar 'sadece normal dosyaları değil dizinleri' ı seçin.
find -type f -exec mv -t collection/ {} +
. Bunun nasıl çalıştığı ile ilgili kılavuz sayfasına bakın.