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

Я пытался скопировать файл test.txt в несколько каталогов одной командой:

cp ~/test.txt ~/folder1 ~/folder2

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

10 ответов

Решение

cp может копировать из нескольких источников, но не может копировать в несколько мест назначения. Увидеть man cp для получения дополнительной информации.

Единственная известная мне команда bash, которая может копировать / сохранять в нескольких местах назначения, tee,

Вы можете использовать его в вашем случае следующим образом:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

Обратите внимание, что tee также записывает ввод в стандартный вывод (stdout). Поэтому, если вы этого не хотите, вы можете предотвратить это, перенаправив стандартный вывод на /dev/null следующим образом:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

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

find dir1 dir2 -exec cp file.txt {} \;

Если у dir1 или dir2 есть подкаталоги, в которые вы не хотите копировать файл, добавьте-maxdepth 0вариант:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Обратите внимание, что это перезапишет каждый файл в dir1 а также dir2 с file.txtсодержание, в дополнение к копированию. Только копировать file.txt не затрагивая другие файлы в этих каталогах, скажите find действовать только на каталоги:

find dir1 dir2 -type d -exec cp file.txt {} \;

Команда

cp ~/test.txt ~/folder1 ~/folder2

пытается скопировать два файла (~/test.txt а также ~/folder1) к месту назначения folder2, (И если ~/folder2 существует и является каталогом, у вас будет предупреждение "пропуск каталога").

Если вы хотите сделать несколько копий файла test.txt, вы должны использовать цикл или несколько команд...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

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

Чтобы скопировать целые каталоги, вы должны использовать -r опция:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

это создаст ~/folder1/folder3 а также ~/folder2/folder3 со всеми файлами в комплекте.

Вы можете создать сценарий справки, или вы можете сделать это с xargs и функция печати (в этом случае echo):

echo firstDir secondDir | xargs -n 1 cp test

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

После долгих поисков эта работа как Шарм тоже!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Это скопирует файл file.txt в каждый каталог вашего текущего местоположения в терминале.

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Это скопирует папку в каждый подкаталог вашего текущего местоположения в терминале.

Я разделяю это, надеюсь, что это помогает и другим.

Если вы хотите скопировать файл test.txt в каждый каталог в /tmp/target/ ...

создать тестовую среду:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

скопируйте это:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

parallel cp foo {} ::: */скопируетfooко всем каталогам в текущем каталоге параллельно:

      $ cd "$(mktemp --directory)"
$ mkdir a 'b c'
$ touch foo
$ parallel cp foo {} ::: */
$ ls --recursive 
.:
 a  'b c'   foo

./a:
foo

'./b c':
foo

Полезно, если вы хотите сделать это быстро. Только помните, что вам нужно заключать команду в кавычки или использовать двойное экранирование, например:

      $ cd "$(mktemp --directory)"
$ mkdir 'a b' 'c d' 'e f'
$ touch 'a b/foo'
$ parallel "cp 'a b/foo' {}" ::: 'c d' 'e f'
$ ls --recursive 
.:
'a b'  'c d'  'e f'

'./a b':
foo

'./c d':
foo

'./e f':
foo

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

cat file1 >file2 >file3

Для файлов или каталогов

xargs -n 1 cp file1 <<< 'file2 file3'
xargs -n 1 cp -r dir1 <<< 'dir2 dir3'

Мне нужно было разместить индексные файлы html в домашнем каталоге 10 вновь созданных поддоменов. Я создал файл с разметкой под названием sites-indexи поместил его в свой рабочий каталог, а другой назвал sites-homeкоторый содержал список полных путей к скопированным файлам в каждой строке (например, /var/path/to/site1/public_html/index.html).

Немного поискав здесь, я наткнулся на следующий bash-скрипт:

      while read file; do cp sites-index "$file"; done < sites-home

Сценарий перебирает список, копирует html-файл на каждой итерации и устанавливает каждую строку в списке как новый путь, по которому копируется html.

Для запуска в терминале введите sudo -iдля запуска корневой оболочки (введите пароль при появлении запроса). Выполните сценарий.

Кроме того, вы можете сохранить команду в текстовом файле, например index.shи вызовите его, набрав в командной строке терминала sudo bash index.sh.

Если запустить скрипт без sudoвы увидите список файлов, которые не были созданы из-за недостаточного разрешения. Если он выполняется правильно, ваши файлы будут созданы без предварительного уведомления.

Просто подумал дать вариант ответа Sylvain Pineau

где dir1 а также dir2 не в вашем текущем каталоге.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

здесь найду поищу dir1 два уровня в глубину или вы можете пропустить -maxdepth параметр для поиска dir1 во всех папках в текущем каталоге и под ним.

Другие вопросы по тегам