У меня есть несколько большие файлы на оптических средах, которые я хотел бы скопировать в несколько целей - в этом случае у меня есть два жестких диска, подключенные к тому же компьютеру. Есть ли утилита, которая может функционировать как:
copy source target1 target2 ... targetN
Для единственных файлов можно использовать tee
скопировать в несколько мест:
cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>
или если Вы предпочитаете demoggified версию:
tee <outfile1> <outfile2> > <outfile3> < <inputfile>
Обратите внимание, что как Dennis указывает в комментариях tee
выводы к stdout
а также перечисленные файлы, следовательно с помощью перенаправления для указания на файл 3 в вышеупомянутых примерах. Вы могли также перенаправить это к /dev/null
как ниже - это имеет преимущество хранения списка файлов, более последовательного на командной строке (который может помочь написать сценарий решения для переменных чисел файлов), но немного менее эффективно (хотя разница в эффективности является небольшой: о том же как различие между использованием cat
версия или версия без cat
):
cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null
Вы могли, вероятно, объединить одно из вышеупомянутого с find
довольно легко воздействовать на несколько файлов в одном каталоге и менее легко воздействовать на файлы, распространенные по структуре каталогов. Иначе Вам, возможно, просто придется выделить несколько операций копии параллельно как отдельные задачи и надеяться, что дисковый кэш ОС является ярким и/или достаточно большим, что каждая из параллельных задач использовала кэшируемые считанные данные сначала вместо того, чтобы вызвать перегрузку головки диска.
ДОСТУПНОСТЬ: tee
обычно доступно на стандартных установках Linux и другом Unix или подобен Unix системы, обычно как часть GNU "coreutils" пакет. При использовании Windows (вопрос не указывает), затем, необходимо найти его в различных портах Windows, таких как Cygwin.
ИНФОРМАЦИЯ О ПРОГРЕССЕ: Поскольку копирование большого файла от оптических сред может занять время (или по медленной сети или еще большему файлу даже от локальных быстрых медиа), информация о прогрессе может быть полезной. На командной строке я склонен использовать средство просмотра канала (доступный в большинстве дистрибутивов Linux и многих наборах порта Windows, и легкий скомпилировать себя, где не доступный непосредственно) для этого - просто заменяют cat
с pv
как так:
pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
Для Windows:
n2ncopy сделает это:
Для Linux:
cp
одна только команда может скопировать с многочисленных источников, но к сожалению не нескольких мест назначения. Необходимо будет выполнить его многократно в каком-то цикле. Можно использовать цикл как так и поместить все имена каталогов в файл:
OLDIFS=$IFS
IFS=$'\n'
for line in $(cat file.txt):
do
cp file $line
done
IFS=$OLDIFS
или используйте xargs:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
Оба из них позволят Вам копировать все файлы каталогов/нескольких. Это также обсуждено в этой статье StackOverflow.
В ударе:
for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;
Решение Ryan Thompson:
for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;
имеет большой смысл: Если скорость записи целевых директоров будет приблизительно тем же затем srcfile, то будет только считан однажды из диска. Остальная часть времени это будет считано из кэша.
Я сделал бы это немного более общим, таким образом, Вы также получаете subdirs:
for x in dest1 dest2 dest3; do cp -a srcdir $x &; done; wait;
Если скорость записи dest директоров очень отличается (например, каждый находится на диске поршня и другом на NFS), то можно видеть, что части чтения srcdir при копировании srcdir к dest1 больше не находятся в дисковом кэше при записи dest2.
В ударе (Linux, Mac или Cygwin):
cat source | tee target1 target2 >targetN
(кладите копии для первого удара, это вводится к STDOUT, таким образом используйте перенаправление на последней цели).
В Windows Cygwin часто является излишеством. Вместо этого можно просто добавить exes из проекта UnxUtils, которые включают кошку, мишень и многих других.