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

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

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

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

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

Ответы [ 21 ]

2 голосов
/ 02 июня 2014

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

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

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

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

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

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

1 голос
/ 31 августа 2018

Использование 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
0 голосов
/ 03 сентября 2009

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

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

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

0 голосов
/ 30 января 2014

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

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico
0 голосов
/ 09 мая 2013

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

для i в $ (ls); сделать cp sourcefile $ i; сделано

0 голосов
/ 11 декабря 2012

Это скопирует в непосредственные подкаталоги, если вы хотите углубиться, отрегулируйте параметр -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

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

0 голосов
/ 22 марта 2016

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

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

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

    cat allFolders.txt | xargs -n 1 cp fileName.txt
    
0 голосов
/ 05 апреля 2015
ls -d */ | xargs -iA cp file.txt A
0 голосов
/ 08 ноября 2014

Мне нравится копировать файл в несколько каталогов, например: 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 строку и уйти на некоторое время.

0 голосов
/ 05 августа 2013

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

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

http://github.com/ddavison/branch

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

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