Как скопировать файл в несколько каталогов с помощью команды gnu cp - PullRequest
197 голосов
/ 12 октября 2008

Можно ли скопировать один файл в несколько каталогов с помощью команды cp?

Я попробовал следующее, которое не сработало:

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}

Я знаю, что возможно использовать цикл for или найти. Но возможно ли использовать команду gnu cp?

Ответы [ 21 ]

563 голосов
/ 13 октября 2008

Вы не можете сделать это только с cp, но вы можете объединить cp с xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

Скопирует file1 в dir1, dir2 и dir3. xargs позвонит cp 3 раза, чтобы сделать это, см. Справочную страницу для xargs для деталей.

101 голосов
/ 12 октября 2008

Нет, cp может копировать несколько источников, но копирует только в одно место назначения. Вам нужно договориться о том, чтобы вызывать cp несколько раз - по одному разу для назначения - для того, что вы хотите сделать; используя, как вы говорите, цикл или другой инструмент.

76 голосов
/ 26 января 2011

Подстановочные знаки также работают с кодом Робертса

echo ./fs*/* | xargs -n 1 cp test 
19 голосов
/ 09 августа 2011

Насколько я понимаю, вы можете использовать следующее:

ls | xargs -n 1 cp -i file.dat

Параметр -i команды cp означает, что вам будет предложено перезаписать файл в текущем каталоге с помощью file.dat. Хотя это не полностью автоматическое решение, оно сработало для меня.

17 голосов
/ 31 января 2012

Я бы использовал cat и tee на основе ответов, которые я видел на https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets вместо cp.

Например:

cat <inputfile> | tee <outfile1> <outfile2> > /dev/null
9 голосов
/ 02 января 2017

Все эти ответы кажутся более сложными, чем очевидные:

for i in /foo /bar; do cp "$file1" "$i"; done
9 голосов
/ 31 января 2014

ls -db di*/subdir | xargs -n 1 cp File

-b в случае пробела в имени каталога в противном случае он будет разбит xargs как другой элемент, если возникла эта проблема с версией echo

6 голосов
/ 21 июня 2016

Не использует cp как таковую, но ...

Это пришло мне в голову в контексте копирования большого количества видеороликов Gopro с (медленной) SD-карты на три (медленных) USB-накопителя. Я хотел прочитать данные только один раз, потому что это заняло вечность. И я хотел, чтобы это было рекурсивно.

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )

(И вы можете добавить больше этих> () разделов, если хотите больше выходов.)

Я не тестировал это, но это определенно намного быстрее, чем cp-in-a-loop (или несколько параллельных вызовов cp).

4 голосов
/ 01 августа 2017

Чтобы использовать копирование с xargs в каталоги с использованием подстановочных знаков в Mac OS, единственное решение, которое мне помогло с пробелами в имени каталога:

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 

Где test - файл для копирования
И ./fs*/* каталоги для копирования в

Проблема в том, что xargs рассматривает пробелы в качестве нового аргумента; решения по изменению символа разделителя с использованием -d или -E, к сожалению, не работают должным образом в Mac OS.

3 голосов
/ 31 марта 2014

Если вы хотите сделать это без разветвленной команды:

tee <inputfile file2 file3 file4 ... >/dev/null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...