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

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

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

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

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

Ответ 1

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

Ответ 2

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

echo dir1 dir2 dir3 | xargs -n 1 cp file1

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

Ответ 3

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

echo ./fs*/* | xargs -n 1 cp test 

Ответ 4

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

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

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

Ответ 6

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

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

Ответ 7

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

for i in /foo /bar; do cp "$file1" "$i"; done

Ответ 8

Не использовать cp per se, но...

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

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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

Существенно эквивалентен ответу xargs, но если вы хотите выполнить параллельное выполнение:

parallel -q cp file1 ::: /foo/ /bar/

Так, например, чтобы скопировать файл1 во все подкаталоги текущей папки (включая рекурсию):

parallel -q cp file1 ::: `find -mindepth 1 -type d`

N.B.: Это, вероятно, только передает заметные приросты скорости для очень конкретных вариантов использования, например. если каждый целевой каталог является отдельным диском.

Он также функционально подобен аргументу '-P' для xargs.

Ответ 12

Использование bash-скрипта

DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
                ..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6

for (( i=0; i<NumberOfDestinations; i++))
    do
        cp  SourcePath/fileName.ext ${DESTINATIONPATH[$i]}

    done
exit

Ответ 13

Другой способ - использовать cat и tee следующим образом:

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

Я думаю, что это было бы довольно неэффективно, поскольку работа была бы разделена между несколькими процессами (по одному на пункт назначения), а жесткий диск записывал сразу несколько файлов по разным частям планшета. Однако, если вы хотите записать файл на несколько разных дисков, этот метод, вероятно, будет довольно эффективным (так как все копии могут происходить одновременно).

Ответ 14

Нет - вы не можете.

Я неоднократно обнаружил, что могу использовать эту функцию, поэтому я сделал свой собственный инструмент для этого.

http://github.com/ddavison/branch

довольно просто -
branch myfile dir1 dir2 dir3

Ответ 15

ls -d */ | xargs -iA cp file.txt A

Ответ 16

Предположим, вы хотите скопировать fileName.txt во все подкаталоги в текущем рабочем каталоге.

  • Получите все имена подкаталогов через ls и сохраните их в некоторый временный файл, скажем, allFolders.txt

    ls > allFolders.txt
    
  • Распечатайте список и передайте его команде xargs.

    cat allFolders.txt | xargs -n 1 cp fileName.txt
    

Ответ 17

Если все ваши целевые каталоги соответствуют выражению пути - как все они являются подкаталогами path/to - тогда просто используйте find в сочетании с cp следующим образом:

find ./path/to/* -type d -exec cp [file name] {} \;

Это.

Ответ 18

если вы хотите скопировать несколько папок в несколько папок, вы можете сделать что-то вроде этого:

echo dir1 dir2 dir3 | xargs -n 1 cp -r/path/toyourdir/{subdir1, subdir2, subdir3}

Ответ 19

Если вам нужно указать, в каких папках для копирования файла вы можете комбинировать поиск с одним или несколькими графами. Например, чтобы заменить любые вхождения favicon.ico в любой подпапке, которую вы можете использовать:

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico

Ответ 20

Это скопирует в непосредственные подкаталоги, если вы хотите глубже, отрегулируйте параметр -maxdepth.

find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html

Если вы не хотите копировать во все каталоги, надеюсь, вы можете отфильтровать каталоги, которые вам не интересны. Пример копирования всех папок, начинающихся с a

find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html

Если вы копируете произвольный/непересекающийся набор каталогов, вам понадобится предложение Роберта Гэмбла.

Ответ 21

Мне нравится копировать файл в несколько каталогов: cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ И копирование каталога в другие каталоги: cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/

Я знаю, что он выпускает несколько команд, но он работает хорошо для меня, когда я хочу напечатать строку 1 и уйти ненадолго.

Ответ 22

Например, если вы находитесь в родительском каталоге папок назначения, которые вы можете сделать:

для я в $(ls); сделать cp исходный файл $i; сделано