Belirli bir türdeki tüm dosyaları Unix'te bir dizine nasıl taşıyabilir (veya kopyalayabilirsiniz)?


22

grep/find/awk/xargsHenüz tüm püf noktalarına aşina değilim .

Belirli bir kalıpla eşleşen bazı dosyalarım var *.xxx. Bu dosyalar belirli bir dizinde rastgele yerlerdedir. Tüm bu dosyaları nasıl bulabilirim ve onları Unix'teki ev dizimdeki bir klasöre nasıl aktarabilirim (henüz mevcut olmayabilir)?


4
"Dosya türü" hakkında konuşurken dikkatli olmalısınız. Unixy ortamlarda, ".xxx" örneği Windows anlamında bir uzantı bile değildir. ".xxx" sadece dosya adının bir sonunu oluşturur. "Dosya türü" birkaç kategoriden daha fazlasıdır: normal dosya, aygıt dosyası, sembolik bağlantı, dizin, boru adı verilen, Unix ailesi soketi, belki birkaçı.
Bruce Ediger


@BruceEdiger teşekkürler ben gerçekten "dosya adı deseni" demek istedim sanırım
qodeninja

Yanıtlar:


22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

1
Ben kullanırımmv -i -t ~/dst {} +
enzotib

17

Eğer (put ≥4 bash, tek bir hedef dizinine bir dizin hiyerarşisi içindeki tüm dosyaları taşımak isterseniz shopt -s globstarsizin içinde ~/.bashrcveya zsh):

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

Diğer kabuklarda:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

Bu findkomut nasıl okunur :

  • .: geçerli dizini geç
  • -name '*.xxx': ismi bu kalıpla eşleşen dosyalara etki eder
  • -exec … \;: bu komutu her dosyaya {}uygulayın, dosyanın yolunu değiştirin

Her dosya için findayrı bir mvişlem başlatması gerekmediği için çok sayıda dosyanız varsa, bunun daha hızlı kullanılmasıyla daha karmaşık bir komut vardır :

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

+Sonunda söyler findAynı anda birden çok dosya üzerinde komutunu çağırmak için. Yana findyalnızca komut satırının sonuna ve en dosya adları koyabilirsiniz mvson hedef dizini olması ihtiyaçları, biz (argümanlar yeniden düzenlemek için bir ara kabuk kullanmak "$0"kabuğuna ilk argüman vardır ~/new-directoryve "$@"gelen müteakip argümanlar vardır find'nin genişlemesi {}).


4

Eşleşen kaynak dosyaların dizin yapısını yeni hedef dizine kopyalamak istiyorsanız, GNU cp's --parents seçeneğini kullanabilirsiniz:

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

Eğer olmadan find kullanabilirsiniz -exec‍sıra:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
Ancak bunun find -execdaha güvenli olduğuna dikkat edin ; örneğin, beyaz boşluk içeren dosya isimlerinde başarısız olur.
dhag,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.