Tüm alt dizinlerden belirli bir uzantıya sahip tüm dosyaları kopyalayın


112

Unix altında, belirli bir uzantıya sahip tüm dosyaları (tüm excel dosyaları) tüm alt dizinlerden başka bir dizine kopyalamak istiyorum. Aşağıdaki komuta sahibim:

cp --parents `find -name \*.xls*` /target_directory/

Bu komutla ilgili sorunlar şunlardır:

  • Dizin yapısını da kopyalar ve ben sadece dosyaları istiyorum (bu nedenle tüm dosyalar / target_directory / dizinine gelmelidir)

  • Dosya adlarında boşluklar olan dosyaları kopyalamıyor (oldukça az)

Bu sorunlar için herhangi bir çözüm var mı?


Peki ya find... exec mv?
fedorqui

Yanıtlar:


174

--parents dizin yapısını kopyalıyor, bu yüzden bundan kurtulmalısınız.

Bunu yazdım yolu, findyürütür ve çıkış tür komut satırı üzerine konur cpdosya ayıran boşluklardan ve alanlarını daha iyi ayırt edemez içinde dosya. Gibi bir şey yapmak daha iyidir

$ find . -name \*.xls -exec cp {} newDir \;

cpdosya adını findbulan ve doğru ileten her dosya adı için çalıştırılır . İşte bu teknik hakkında daha fazla bilgi .

Yukarıdakilerin hepsi yerine zsh kullanabilir ve basitçe yazabilirsiniz

$ cp **/*.xls target_directory

zsh joker karakterleri alt dizinleri içerecek şekilde genişletebilir ve bu tür şeyleri çok kolaylaştırır.


2
Evet. 'bin it' onu atmak anlamına gelir. Şimdi değiştirildi :-)
Brian Agnew

13
Bash4.0+ ve ksh93ayrıca destekler **. Bash shopt -s globstariçin etkinleştirmek için kullanın . Ksh için, set -Gya da set -o globstar.
pynexj

2
@Daryl - Daha fazla doldurdum. Ancak cevap zaten 'kabul edildi' olarak işaretlenmişti, not
Brian Agnew

5
Bu exec teknik olarak find . -name '*.xls' -print0 | xargs -0 cp -t destdir
xarg'lara

2
@BrianAgnew Oh, eminim, ileriye dönük Google çalışanları için yorumlarda fazladan bilgi almak güzel.
Taywee

37

Yukarıdakilerin hepsinden bu versiyonu buldum. Bu sürüm, mac kurtarma terminalinde de benim için çalışıyor.

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

Geçerli dizine ve yinelemeli olarak xsl uzantılı dosyaların tüm alt dizinlerine bakacaktır. Hepsini hedef dizine kopyalayacaktır.

cp bayrakları şunlardır:

  • p - dosyanın özniteliklerini koru
  • r - özyinelemeli
  • v - ayrıntılı (size neyin kopyalandığını gösterir)

1
Bu, SSH Bluehost'a girdiğinde yapmak zorunda olduğum şeyle aynı.
Plummer

4
Alt dizinleri SUNMAZ.
b005t3r

3
@ b005t3r, bu tasarım gereği, olması gerekmiyor. OP'nin sorusunun tüm amacı buydu.
Alt

2
Alt dizinleri korumak için bunu değiştirmenin bir yolu var mı?
Matthew Dean

8

Benzer bir problemim vardı. Bunu kullanarak çözdüm:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'Ve ";"her dosya üzerinde kopya yürütür.


3

Bunu kendim de yapmak zorunda kaldım. Bunu, cp için --parents argümanıyla yaptım:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

--parents'ı kaldırabilirsiniz, ancak birden fazla dosya aynı adı taşıyorsa çakışma riski vardır.

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.