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

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

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

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

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

21 ответов


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


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

echo dir1 dir2 dir3 | xargs -n 1 cp file1

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


шаблоны и работать с Робертс код

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

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

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

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


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

например:

cat <inputfile> | tee <outfile1> <outfile2> > /dev/null

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

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


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

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

не используя 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 вызовы.)


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

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


использовать копирование с xargs каталогам, использующим подстановочные знаки в Mac OS, единственное решение, которое сработало для меня С пробелы в имени Директории:

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

здесь test это файл для копирования
И ./fs*/* каталоги для копирования

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


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

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

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

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

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

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


нет - нельзя.

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

http://github.com/ddavison/branch

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


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

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

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

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

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

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

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

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


использование скрипта 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

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

Эхо dir1 и Директория dir2 dir3 | команды xargs -Н 1 КП -Р /путь/toyourdir/{каталог subdir1,каталог subdir2,subdir3}


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

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

это будет копировать в непосредственные подкаталоги, если вы хотите углубиться, отрегулируйте


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


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

для i в $(ls); do CP sourcefile $i; done