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