Komut satırını kullanarak bir dosyayı birden fazla klasöre nasıl kopyalarım?


67

Bir dosyayı test.txtbir komutla birden fazla klasöre kopyalamaya çalıştım :

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

Ama başaramadım. Bir komutla bunu yapmanın bir yolu var, böylece bir dosyayı veya bir klasörü birden fazla klasöre kopyalayabilir miyim?


Kolayca değil. Bir klasörün mevcut birden çok kopyasını etkin bir şekilde güncellemek için "rsync" ifadesine bakmak isteyebilirsiniz
Thorbjørn Ravn Andersen

3
Biraz bash-script öğrenmeyi deneyin. Çok faydalı olabilir:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz

Tek bir komut değil, ancak buraya tökezleyen bazı insanlara yardım edebilir:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Manu Järvinen 14

Yanıtlar:


71

cpbirden çok kaynaktan kopyalayabilirsiniz, ancak edemez birden fazla hedefe kopyalar. Daha man cpfazla bilgi için bakınız .

Birden fazla hedefe kopyalayabilecek / kaydedebileceklerini bildiğim tek bash komutu tee.

Çantanızda aşağıdaki gibi kullanabilirsiniz:

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

teeAyrıca girişi standart çıktıya (stdout) da yazdığını unutmayın . Dolayısıyla bunu istemiyorsanız, standart çıktıyı aşağıdaki /dev/nullgibi yeniden yönlendirerek önleyebilirsiniz :

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
Zeki, bu hile yapıyor! :)
terdon

5
+1, zekice! Eğer >/dev/nulleserleri ikili dosyalarla da kullanıyorsanız, terminali karıştırmadan ...
Rmano

1
Senin için +1, her zaman anne adamım :), ama bir dizini kopyalamak istersem
nux

2
kullanmayı unutmayın @nux -rile seçeneği cpdizinleri durumunda
Radu Rădeanu

4
@ nux: teeaksine, cpdosyanın içeriğini, sahipliğini ve zaman damgalarını yok sayarak yalnızca dosyanın içeriğini kopyalar. Dosya f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
adını

61

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

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

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

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

Bu her dosyanın üzerine unutmayın dir1ve dir2birlikte file.txtkopyalayarak ek olarak, 'in içindekiler. Yalnızca file.txtbu dizinlerdeki diğer dosyaları etkilemeden kopyalamak için, yalnızca dizinleri etkilemesini söyleyin find:

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

4
Güzel çözüm! Bana tişörtden daha mükemmel görünüyor.
Danatela

1
Gerçekten de, hiçbir yönlendirme söz konusu değildir ve yine de bir komuttur.
Sylvain Pineau

2
@SylvainPineau Aslında 3 vardır: biri findiki kezdir (bu durumda) cp. Bunun findçok zamana ihtiyacı olduğunu söylememek .
Radu Rădeanu

3
"Komut" un tanımı "exec" çağrısıysa, belki, ama bu benim kitabımdaki "one command".
kojiro

2
Buna geri dönmeye devam ediyorum, bu yüzden bir olumlu oy vermem gerektiğini düşündüm: D
Jonathan

31

Komuta

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

Hedefe iki dosya ( ~/test.txtve ~/folder1) kopyalamaya çalışır folder2. (Ve ~/folder2varsa ve bir dizin ise, "atlayan bir dizin" uyarısı olacak).

Dosyanın birden fazla kopyasını almak test.txtistiyorsanız, bir döngü veya birden çok komut kullanmanız gerekir ...

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

(... ve dosya adlarına gömülü boşluklar varsa dikkatli olun, alıntı yapmanız gerekir).

Tüm dizinleri kopyalamak için bu -rseçeneği kullanmanız gerekir :

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

Bu ~/folder1/folder3ve ~/folder2/folder3dahil tüm dosyaları yaratacaktır .


1
Geçen okuyucu için: Spesifikasyona göre , bir for döngüsü bir bileşik komuttur. Bu nedenle, bu hala bir emirdir ve soru için tüm gereklilikleri karşılar.
kojiro

@nux, düzeltmelerde hemfikir değilim. 1) iki başkent yanlıştır, niyetim emirleri emirlere harmanlamaktı. 2) üç nokta bir stil meselesidir; lütfen
stilimin

1
tamam üzgünüm dostum daha iyi görüneceğini düşündüm.
nux

sistemimde, klasör3'ü ~ / klasör1 / klasör3 olarak kaydetmez, ancak
klasör3'teki

23

Bir yardım komut dosyası oluşturabilir veya bunu xargsve bir yazdırma işlevi ile yapabilirsiniz (bu durumda, echo):

echo firstDir secondDir | xargs -n 1 cp test

Bu, her dizini cpişlev olarak bir argüman olarak test dosyasını parametre olarak kullanarak yapar .


Bu muhtemelen sorunun en iyi / en doğrudan cevabı
Bryson S.

7

Uzun bir aramadan sonra bu da bir Charm gibi çalışır!

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

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

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

Bu, klasördeki geçerli konumunuzdaki her alt dizine bir klasör kopyalar.

Başkalarına da yardımcı olacağını umuyorum.


İçinde zsh, for i in *(/); ...tüm alt dizinlerde dolaşmak için kullanabilirsiniz, böylece [ -d ...sınamayı engelleyebilirsiniz . Genişletilmiş globbing, hoşuma gitme nedenlerimden biri bash.
Rmano

Bir komutta tekrar kodu sağ olabilir
nux

1
In zsh, bu cevabın ilk komutu olarak basitleştirilebilir for dir in *(/); do cp /path/file.txt "$dir"; done. Bkz zsh.sourceforge.net/Intro/intro_2.html
Rmano

5
Testi, herhangi bir Bourne türevi kabuğundafor dir in */;
Henk Langeveld

@nux Bu gerçekten iyi çalışıyor ve komut takip etmek çok kolaydır. Çok daha yüksek oy alınması gerekiyor!
nukeguy

1

Test.txt dosyasını / tmp / target / ... içindeki her dizine kopyalamak istiyorsanız

bir test ortamı yaratın:

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 {} \;

0

Sadece cevabına bir değişiklik yapmayı düşündüm Sylvain Pineau

nerede dir1ve dir2geçerli dizinde değildir.

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

Burada bulmak dir1iki seviye derinliğine bakacak veya geçerli dizindeki ve altındaki tüm klasörlerde -maxdepthbulmak için parametreyi bırakabilirsiniz dir1.

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.