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

Это сложный вопрос без простых ответов ..

Любая передача «точка-точка» должна учитывать все возможные элементы, которые могут ограничивать скорость, влиять на задержку или просто останавливать вещи из (! d1)

Теоретический

Кроме того, возможно, вне темы для этого форума.

Вот чужой ответ:

Whirlpool.net.au> Gigabit .. какова фактическая скорость передачи

Гигабит до 125 МБ / с

Это просто математика, основанная на теоретических 1 гигабит / с и 8 бит в байтах.

Гигабит до 125 МБ / с

1) Накладные расходы TCP. Самое высокое, что вы когда-либо видели в идеальном мире, составляет около 100 МБ / с. 2) Пропускная способность диска. Ваш диск, вероятно, будет самым медленным звеном в цепочке здесь - поиск скорости, скорости доступа, все они играют определенную роль. 3) машинный ввод-вывод. Если ваш компьютер находится под нагрузкой, это, вероятно, повлияет на скорость передачи.
1
задан 27 August 2014 в 16:43

6 ответов

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

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

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

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 {} \;
52
ответ дан 24 May 2018 в 10:54
  • 1
    Хорошее решение! Кажется мне более совершенным, чем с тройником. – Danatela 11 March 2014 в 23:55
  • 2
    Действительно, перенаправление не задействовано, и это еще одна команда. – Sylvain Pineau 12 March 2014 в 00:03
  • 3
    @SylvainPineau На самом деле есть 3: один - find и два раза (в данном случае) cp. Не сказать, что find нужно много времени. – Radu Rădeanu 12 March 2014 в 00:13
  • 4
    Если определение "команды" является "exec" вызов, возможно, но это «одна команда». в моей книге. – kojiro 12 March 2014 в 04:27
  • 5
    Я продолжаю возвращаться к этому, поэтому подумал, что я должен дать преимущество: D – Jonathan 13 November 2015 в 16:46

Команда

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

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

Если вы хотите сделать несколько копий файла 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 со всеми включенными файлами.

30
ответ дан 24 May 2018 в 10:54
  • 1
    Для передатчика: Согласно spec , цикл for представляет собой составную команду. Поэтому это еще одна команда и отвечает всем требованиям для вопроса. – kojiro 12 March 2014 в 04:35
  • 2
    @nux, я не согласен с исправлениями. 1) две столицы ошибаются, мое намерение заключалось в том, чтобы чередовать команды во фразе. 2) многоточие - это вопрос стиля; пожалуйста, пусть мой стиль в. – Rmano 13 March 2014 в 22:06
  • 3
    хорошо, мне жаль, я думал, что это будет выглядеть лучше. – nux 13 March 2014 в 22:09
  • 4
    в моей системе он не сохраняет папку3 как ~ / folder1 / folder3, а скорее копирует все в папке3 в папку1 – alpha_989 16 September 2017 в 02:05

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

echo firstDir secondDir | xargs -n 1 cp test

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

22
ответ дан 24 May 2018 в 10:54

После долгого поиска эта работа как Charm также!

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

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

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

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

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

6
ответ дан 24 May 2018 в 10:54
  • 1
    В zsh вы можете использовать for i in *(/); ... для перебора всех подкаталогов, поэтому вы можете избежать теста [ -d .... Расширенное подтягивание - одна из причин, по которой мне это нравится bash. – Rmano 12 March 2014 в 08:43
  • 2
    можете снова изменить код в команде – nux 12 March 2014 в 18:13
  • 3
    В zsh первая команда этого ответа может быть упрощена как for dir in *(/); do cp /path/file.txt "$dir"; done. См. zsh.sourceforge.net/Intro/intro_2.html – Rmano 12 March 2014 в 20:01
  • 4
    Вы можете исключить тест в любой производной от Bourne оболочке с помощью for dir in */; – Henk Langeveld 13 March 2014 в 14:05
  • 5
    @nux Это работает очень хорошо, и команде очень легко следовать. Его нужно проголосовать намного выше! – nukeguy 15 July 2016 в 19:44

Если вы хотите скопировать файл 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 {} \;
1
ответ дан 24 May 2018 в 10:54

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

, где dir1 и dir2 не находятся в вашем текущем каталоге.

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

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

0
ответ дан 24 May 2018 в 10:54

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

Похожие вопросы: