Как скопировать один файл в несколько каталогов в Linux или Unix

Если я хочу скопировать один файл в три разных местоположения (каталога), используя одну команду cp (например, cp file /dir1/ /dir2/ /dir3/. Возможно ли это? Если да, предоставьте команду для GNU / Linux или Unix.

Короткий ответ: нет. Вы не можете использовать GNU/cp или BSD/cp для копирования одного файла в несколько каталогов. Однако вы можете использовать комбинацию cp и xargs/parallel и других команд для копирования одного файла в несколько каталогов в MacOS, Linux, FreeBSD, OpenBSD, NetBSD и Unix-подобных системах.

Как скопировать один файл в несколько каталогов в Linux или Unix

Команда cp

Основной синтаксис команды cp заключается в следующем: копирование нескольких файлов в один каталог:

cp file1 /dir1/
cp file1 file2 file3 /dir1/

Скопируйте файл в несколько каталогов в Unix или Linux

Хитрость заключается в использовании команды xargs или команды GNU parallel.

Копирование одного файла под названием foo.txt в несколько директорий под названием /tmp/1/, /tmp/2/, и /tmp/3 с помощью xargs

Команда xargs создает список аргументов и выполняет утилиту, такую как cp или mv. Синтаксис выглядит следующим образом:

xargs -n 1 cp -v filename<<<"/dir1/ /dir2/ /dir3/" 
 
## OR ##
echo "/dir1/ /dir2/ /dir3/" | xargs -n 1 cp -v filename

В данном примере скопируйте /etc/passwd в /tmp/1/, /tmp/2/, и $HOME/3/ следующим образом:

xargs -n 1 cp -v /etc/passwd<<<"/tmp/1/ /tmp/2/ $HOME/3/"

ИЛИ

echo "/tmp/1/ /tmp/2/ $HOME/3/" | xargs -n 1 cp -v /etc/passwd

Примеры возможных выводов данных:

Копирование нескольких файлов в разные каталоги с помощью Linux / Unix cp команды
Рисунок 01: Копирование нескольких файлов в разные каталоги с помощью Linux / Unix cp команды.

Копирование одного файла под названием foo.txt в несколько директорий под названием /tmp/1/, /tmp/2/, и /tmp/3 с помощью parallel

GNU parallel является инструментом оболочки для выполнения задач в parallel, используя один или более компьютеров. Синтаксис выглядит следующим образом:

parallel cp fileNameHere ::: /dir1/ /dir2/ /dir3/

В данном примере скопируйте /etc/resolv.conf в /tmp/1/, /tmp/2/, в $HOME/3/ следующим образом:

parallel cp -v /etc/resolv.conf ::: /tmp/1/ /tmp/2/ $HOME/3/

Примеры возможных выводов данных:

/etc/resolv.conf -> /tmp/2/resolv.conf
/etc/resolv.conf -> /tmp/1/resolv.conf
/etc/resolv.conf -> /Users/vivek/3/resolv.conf

Как использовать команду tee для копирования файла в несколько папок

Предположим, что вы хотите скопировать /etc/resolv.conf в /tmp/1/ и /tmp/2/, тогда вам нужно запустить команду tee следующим образом:

tee /tmp/1/resolv.conf /tmp/2/resolv.conf < /etc/resolv.conf tee /tmp/1/resolv.conf /tmp/2/resolv.conf < /etc/resolv.conf >/dev/null

Вам нужно указать полный путь вроде /tmp/1/resolv.conf, в противном случае вы столкнетесь со следующей ошибкой:

tee: /tmp/1/: Is a directory

Как использовать команду find для копирования файлов в несколько директорий одновременно

Для команды find синтаксис выглядит следующим образом:

find /dir1/ /dir2/ -maxdepth 0 -exec cp filename {} \;

Чтобы скопировать /etc/hosts одновременно в /tmp/{1,2}/ и $HOME/3/ папки в системах Linux/Unix/MacOS/FreeBSD и т.д., введите:

find /tmp/1/ /tmp/2/ $HOME/3/ -maxdepth 0 -exec cp /etc/hosts {} \;

Примеры возможных выводов данных:

/etc/hosts -> /tmp/1/hosts
/etc/hosts -> /tmp/2/hosts
/etc/hosts -> /Users/vivek/3/hosts

Цикл оболочки

Вы также можете использовать bash для цикла следующим образом:

for dest in /dir1/ /dir2/ ; do cp -v file "$dest" ; done
for dest in /tmp/1/ /tmp2/ $HOME/3/ ; do cp -v "/etc/resolv.conf" "$dest" ; done

Перевод: Анна Давыдова
Источник: cyberciti.biz

Это интересно:

Оставьте комментарий