Для отдельных файлов вы можете использовать tee
для копирования в несколько мест:
cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>
или если вы предпочитаете демоггифицированную версию:
tee <outfile1> <outfile2> > <outfile3> < <inputfile>
Обратите внимание, что, как указывает Деннис в tee
выходных комментариях, stdout
так и перечисленных файлах, следовательно, используя перенаправление, чтобы указать на файл 3 в приведенных выше примерах. Вы также можете перенаправить это к следующему /dev/null
пункту - это имеет преимущество, заключающееся в том, что список файлов более согласован в командной строке (что может облегчить написание сценария решения для переменного числа файлов), но немного менее эффективен (хотя разница в эффективности небольшая: примерно такая же, как разница между использованием cat
версии или версии без нее cat
):
cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null
Вероятно, вы могли бы комбинировать одно из вышеперечисленного с find
довольно легко работать с несколькими файлами в одном каталоге и менее легко работать с файлами, распределенными по структуре каталогов. В противном случае вам может потребоваться отключить несколько операций копирования параллельно в качестве отдельных задач и надеяться, что кэш диска ОС будет достаточно ярким и / или достаточно большим, чтобы каждая из параллельных задач использовала кэшированное чтение данных с первой, а не вызывало дисковод обмолота.
НАЛИЧИЕ: tee
обычно доступно в стандартных установках Linux и других unix- или unix-подобных системах, обычно в составе пакета «coreutils» GNU. Если вы используете Windows (ваш вопрос не указан), вы должны найти его в различных портах Windows, таких как Cygwin.
ИНФОРМАЦИЯ О ПРОГРЕССЕ. Поскольку копирование большого файла с оптического носителя может занять некоторое время (или по медленной сети, или даже по более крупному файлу даже с локального быстрого носителя), информация о ходе может быть полезной. В командной строке я предпочитаю использовать зритель трубы (доступен в большинстве Linux дистрибутивов и многих коллекциях портов для Windows и легко скомпилировать себя , где не доступны напрямую) для этого - просто заменить cat
с pv
следующим образом:
pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
tee
это также приведет к выводу на стандартный вывод, так что вы можете захотеть это сделать,tee outputfile1 outputfile2 < inputfile > /dev/null
поскольку вывод двоичного файла на терминал может быть шумным и мешать его настройкам.tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
Для Windows:
n2ncopy сделает это:
Для Linux:
Только
cp
команда может копировать из нескольких источников, но, к сожалению, не из нескольких мест Вам нужно будет запустить его несколько раз в каком-то цикле. Вы можете использовать цикл вроде так и поместить все имена каталогов в файл:или используйте xargs:
Оба из них позволят вам скопировать целые каталоги / несколько файлов. Это также обсуждается в этой статье StackOverflow.
источник
Исходя из ответа на аналогичный вопрос Другой способ - использовать GNU Parallel для одновременного запуска нескольких
cp
экземпляров:Приведенная выше команда копирует file1 во все три папки назначения параллельно
источник
В bash (Linux, Mac или Cygwin):
(т. е. копирует входные данные в STDOUT, поэтому используйте перенаправление на последнюю цель).
В Windows Cygwin часто бывает излишним. Вместо этого вы можете просто добавить exe- файлы из проекта UnxUtils , которые включают cat, tee и многие другие.
источник
Решение Райана Томпсона:
имеет большой смысл: если скорость записи целевых каталогов примерно одинакова, то srcfile будет считан с диска только один раз. В остальное время он будет читаться из кеша.
Я бы сделал это немного более общим, поэтому вы также получите подкаталоги:
Если скорость записи папок dest очень различна (например, одна находится на оперативном диске, а другая - в NFS), то вы можете увидеть, что части чтения srcdir при копировании srcdir в dest1 больше не находятся в кеше диска при записи dest2.
источник
Согласно этому ответу: /superuser//a/1064516/702806
Лучшим решением является использование
tar
иtee
. Команда более сложная, ноtar
кажется очень мощной для передачи И ей нужно прочитать источник только один раз.tar -c /source/dirA/ /source/file1 | tee >(cd /foo/destination3/; tar -x) >(cd /bar/destination2/; tar -x) >(cd /foobar/destination1/; tar -x) > /dev/null
Чтобы использовать его в сценарии, вам может потребоваться запустить сценарий с
bash -x script.sh
источник
tar
том, что он автоматически копирует (сохраняет) атрибуты файла (например, дату / время изменения, режим (защита) и, возможно, списки ACL, владелец / группу (если есть привилегии), SELinux контекст (если применимо), расширенные атрибуты (если применимо) и т. д.) ………………… PS Зачем пользователю использоватьbash -x
?#!/bin/sh
в начале моего сценария, но синтаксис команды не принят. Вы можете использоватьbash -x
или#!/bin/bash
в начале вашего файла. Я не знаю , почему существует разница междуsh
иbash
интерпретации.В Баш:
источник
Если вы хотите сделать это в Windows из PowerShell, это невозможно по умолчанию, поскольку в отличие от
-Path
аргумента,-Destination
он не принимает несколько аргументов. Однако вы можете использовать-Passthrough
и последовательно соединять команды. (Но это не весело.)Лучшее решение - сделать свое, как показано здесь .
источник