Как скопировать файл в несколько папок с помощью командной строки?

58

Я попытался скопировать файл test.txt в несколько каталогов с помощью одной команды:

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

Но мне это не удалось. Есть ли способ сделать это в одной команде, чтобы я мог скопировать файл или даже папку в несколько каталогов?

    
задан nux 11.03.2014 в 17:11
источник

7 ответов

64

cp может копировать из нескольких источников, но не может копировать в несколько пунктов назначения. Дополнительную информацию см. В разделе man cp .

Единственная команда bash, которую я знаю, которая может копировать / сохранять для нескольких получателей, - tee .

Вы можете использовать его в своем случае следующим образом:

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

Обратите внимание, что tee также записывает вход в стандартный вывод (stdout). Поэтому, если вы этого не хотите, вы можете предотвратить это путем перенаправления стандартного вывода на /dev/null следующим образом:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
    
ответ дан Radu Rădeanu 11.03.2014 в 18:01
источник
52

Другим способом достижения копии в нескольких местах является следующая команда:

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

Если dir1 или dir2 имеют подкаталоги, которые вы не хотите скопировать в файл, добавьте -maxdepth 0 :

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

Обратите внимание, что это будет перезаписывать каждый файл в dir1 и dir2 с содержимым file.txt , в дополнение к его копированию. Чтобы скопировать file.txt , не влияя на другие файлы в этих каталогах, скажите find действовать только в каталогах:

find dir1 dir2 -type d -exec cp file.txt {} \;
    
ответ дан Sylvain Pineau 11.03.2014 в 17:31
30

Команда

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

пытается скопировать два файла ( ~/test.txt и ~/folder1 ) в пункт назначения folder2 . (И если ~/folder2 существует и является каталогом, у вас будет предупреждение «omitting directory»).

Если вы хотите сделать несколько копий файла test.txt , вам нужно использовать цикл или несколько команд ...

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

(... и будьте осторожны, если в именах файлов есть пробелы, вам нужно указать).

Чтобы скопировать целые каталоги, вы должны использовать опцию -r :

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

это создаст ~/folder1/folder3 и ~/folder2/folder3 со всеми включенными файлами.     

ответ дан Rmano 11.03.2014 в 17:25
22

Вы можете создать скрипт справки, или вы можете сделать это с помощью xargs и функции печати (в данном случае echo ):

echo firstDir secondDir | xargs -n 1 cp test

Это сделает каждый каталог аргументом функции cp , используя test файл в качестве параметра.

    
ответ дан Evandro Silva 11.03.2014 в 17:28
6

После долгого поиска эта работа также понравится Charm!

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

Это скопирует file.txt в каждый каталог вашего текущего местоположения в терминале.

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

Это скопирует папку в каждый подкаталог в вашем текущем местоположении в терминале.

Я разделяю это, надеюсь, что это тоже помогает другим.

    
ответ дан nux 12.03.2014 в 01:06
1

Если вы хотите скопировать файл test.txt в каждый каталог в / tmp / target / ...

создать тестовую среду:

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

скопируйте его:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
    
ответ дан matt 29.06.2015 в 16:26
0

Просто подумал дать вариант ответа Sylvain Pineau

, где dir1 и dir2 не находятся в вашем текущем каталоге.

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

здесь find будет искать dir1 на двух уровнях, или вы можете оставить -maxdepth , чтобы найти dir1 во всех папках в текущем каталоге и ниже.

    
ответ дан Joshi 07.10.2017 в 20:42