Komut satırını kullanarak bir dosyayı birden çok klasöre nasıl kopyalayabilirsiniz?

59

test.txt dosyasını bir komutla birden çok dizine kopyalamayı denedim:

cp ~/test.txt ~/folder1 ~/folder2

Ama başaramadım. Tek bir komutta bunu yapmanın bir yolu var mı? Böylece bir dosyayı veya bir klasörü birden çok dizine kopyalayabilirim?

    
sordu nux 11.03.2014 17:11

7 cevap

65

cp , birden çok kaynaktan kopyalanabilir, ancak birden fazla hedefe kopyalayamaz . Daha fazla bilgi için man cp bölümüne bakın.

Birden çok hedefe kopyalayabilen / kaydedebilen tek bash komutu tee .

Durumunuzda aşağıdaki gibi kullanabilirsiniz:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

tee öğesinin de girişi standart çıktıya (stdout) yazdığını unutmayın. Bunu istemiyorsanız, standart çıktıyı aşağıdaki gibi /dev/null 'ye yönlendirerek engelleyebilirsiniz:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
    
verilen cevap Radu Rădeanu 11.03.2014 18:01
54

Birden çok konuma kopyalamanın başka bir yolu aşağıdaki komuttur:

find dir1 dir2 -exec cp file.txt {} \;

dir1 veya dir2, dosyanın kopyalanmasını istemediğiniz alt dizinlere sahipse, ekleyin -maxdepth 0 seçeneği:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Bunun, kopyalamaya ek olarak, dir1 ve dir2 dizinindeki file.txt 'sindeki tüm dosyaların üzerine yazılacağını unutmayın. Bu dizinlerdeki diğer dosyaları etkilemeden yalnızca file.txt kopyasını kopyalamak için find öğesinin yalnızca dizinlerde işlem yapmasını söyleyin:

find dir1 dir2 -type d -exec cp file.txt {} \;
    
verilen cevap Sylvain Pineau 11.03.2014 17:31
30

Komut

cp ~/test.txt ~/folder1 ~/folder2

, iki dosyayı ( ~/test.txt ve ~/folder1 ) hedef folder2 kopyalamaya çalışır. (% Co_de% var ise ve bir dizin ise "atlatma dizini" uyarısı alacaksınız.

~/folder2 dosyasının birden çok kopyasını yapmak istiyorsanız, bir döngü veya çoklu komut kullanmanız gerekir ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... ve dosya adlarına yerleştirilmiş boşluklarınız varsa dikkatli olun, alıntı yapmanız gerekir).

Tüm dizinleri kopyalamak için test.txt seçeneğini kullanmalısınız:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

Bu, dahil edilen tüm dosyalar ile -r ve ~/folder1/folder3 oluşturur.

    
verilen cevap Rmano 11.03.2014 17:25
23

Bir yardım komut dosyası oluşturabilir veya bunu xargs ve bir baskı işleviyle yapabilirsiniz (bu durumda, echo ):

echo firstDir secondDir | xargs -n 1 cp test

Bu, her dizini test dosyasını parametre olarak kullanarak cp işlevine bir argüman oluşturacaktır.

    
verilen cevap Evandro Silva 11.03.2014 17:28
6

Uzun bir aramanın ardından bu bir Çekicilik gibi çalışır!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Bu, file.txt adresini geçerli konumunuzdaki terminaldeki her dizine kopyalayacaktır.

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Bu, geçerli konumunuzdaki terminaldeki her bir alt dizine bir klasör kopyalayacaktır.

Paylaşıyorum umarım başkalarına da yardım eder.

    
verilen cevap nux 12.03.2014 01:06
1

Test.txt dosyasını / tmp / target / ... dizinindeki her dizine kopyalamak isterseniz ...

bir test ortamı oluşturun:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

kopyala:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
    
verilen cevap matt 29.06.2015 16:26
0

Sadece Sylvain Pineau

cevabına bir varyasyon vermeyi düşündüm

dir1 ve dir2 geçerli dizininizde değil.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

buradaki dir1 iki seviyesini bulacağınızı veya -maxdepth parametresini dir1 dizinini bulmak için şu anki dizinde ve altındaki tüm klasörler içinde bulabilirsiniz.

    
verilen cevap Joshi 07.10.2017 20:42

Etiketlerdeki diğer soruları oku