как копировать файл в несколько папок в ubntu
Как скопировать один файл в несколько каталогов в Linux или Unix
Я хочу  скопировать один файл в три места (каталоги), с помощью одной команды ср (например , файл cp /dir1/ /dir2/ /dir3/. Возможно ли это? Если да, то просьба указать команду для GNU / Linux или Unix операционных систем.
Короткий ответ: нет. Вы не можете использовать GNU /cp или BSD / cp для копирования одного файла в несколько каталогов. Тем не менее, вы можете использовать комбинацию cp и xargs / параллельно и другие команды для копирования одного файла в несколько каталогов в MacOS, Linux, FreeBSD, OpenBSD, NetBSD и Unix-подобных системах.
Команда ср
Основной синтаксис cp выглядит следующим образом, скопировать несколько файлов в одном каталоге:
cp file1 /dir1/ cp file1 file2 file3 /dir1/
| 
 1 
2  | 
 cp file1 /dir1/ 
cp file1 file2 file3 /dir1/  | 
Скопируйте файл в несколько каталогов в Unix или Linux
Хитрость заключается в том, чтобы использовать команду xargs или параллельной команды GNU.
Копирование одного файла с именем foo.txt в несколько каталогов с именем /tmp1/ /tmp2/ b /tmp3/ с помощью xargs
В xargs команда позволяет выпонить построения списка (ов) аргумент и выполнить команду cp или mv Синтаксис:
xargs -n 1 cp -v filename<<<"/dir1/ /dir2/ /dir3/" ## OR ## echo "/dir1/ /dir2/ /dir3/" | xargs -n 1 cp -v filename
| 
 1 
2 
3  | 
 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/"
| 
 1  | 
 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
| 
 1  | 
 echo "/tmp/1/ /tmp/2/ $HOME/3/" | xargs -n 1 cp -v /etc/passwd  | 
Копирование одного файла с именем foo.txt в несколько каталогов , называемых /tmp/1 /tmp/2 и /tmp/3 , используя parallel
GNU parallel является инструментом оболочки для выполнения заданий в параллельном режиме с использованием одного или нескольких процессов. Синтаксис:
parallel cp fileNameHere ::: /dir1/ /dir2/ /dir3/
| 
 1  | 
 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/
| 
 1  | 
 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
| 
 1 
2 
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/ and /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
| 
 1 
2  | 
 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
| 
 1  | 
 tee: /tmp/1/: Is a directory  | 
Как использовать команду find для копирования файлов в несколько директорий одновременно
Синтаксис выглядит следующим образом для команды find:
find /dir1/ /dir2/ -maxdepth 0 -exec cp filename {} \;
| 
 1  | 
 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 {} \;
| 
 1  | 
 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
| 
 1 
2 
3  | 
 /etc/hosts > /tmp/1/hosts 
/etc/hosts > /tmp/2/hosts 
/etc/hosts > /Users/vivek/3/hosts  | 
Использование циклов
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
| 
 1 
2  | 
 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  |