Параллельная копия файла от единственного источника до нескольких целей?

У меня есть несколько большие файлы на оптических средах, которые я хотел бы скопировать в несколько целей - в этом случае у меня есть два жестких диска, подключенные к тому же компьютеру. Есть ли утилита, которая может функционировать как:

copy source target1 target2 ... targetN
15
задан 02.07.2015, 09:26

5 ответов

Для единственных файлов можно использовать 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>
23
ответ дан 07.12.2019, 11:01

Для Windows:

n2ncopy сделает это:

alt text

Для 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.

5
ответ дан 07.12.2019, 11:01

В ударе:

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;
0
ответ дан 07.12.2019, 11:01
  • 1
    я не думаю, что это будет работать хорошо. в идеально параллельной копии Вы читали бы однажды, пишущий много раз. я думаю, что это сделает 1:1 reads:writes. возможно, если копии запускаются достаточно быстро и управляют кэшем, является достаточно большим, Вы не должны будете на самом деле искать считывающие головки. – quack quixote 05.10.2009, 02:23

Решение 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.

1
ответ дан 07.12.2019, 11:01

В ударе (Linux, Mac или Cygwin):

cat source | tee target1 target2 >targetN

(кладите копии для первого удара, это вводится к STDOUT, таким образом используйте перенаправление на последней цели).

В Windows Cygwin часто является излишеством. Вместо этого можно просто добавить exes из проекта UnxUtils, которые включают кошку, мишень и многих других.

2
ответ дан 07.12.2019, 11:01

Теги

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