Как извлечь файл tar.gz одновременно в два места назначения?

Чтобы расширить косвенность массива, строка [@]должна быть частью переменной. Работает для значений:

for thelist in "${master_list[@]}" ; do
    reallist=$thelist[@]
    for key in "${!reallist}" ; do
        echo "the key is: $key"
    done
done

Что касается ключей, я не вижу пути без eval.

for thelist in "${master_list[@]}" ; do
    eval keys=('"${!'$thelist'[@]}"')
    for key in "${keys[@]}" ; do
        echo "the key is: $key"
    done
done

Если вы уверены, что главный _список содержит только имена переменных, он должен быть безопасным.

6
07.02.2020, 17:01
2 ответа

Вы можете использовать zcatдля извлечения в stdout, затем teeдля разветвления на два разных файла, затем tarих.

zcat bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second

Он извлечет ваш большой файл по "первому" и "второму" путям.

Можно и с gunzip -c:

gunzip -c bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second
0
28.04.2021, 23:24

В zshиспользование подстановки процесса и похожегоtee-поведения при многократном перенаправлении файлового дескриптора:

zcat file.tar.gz > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

С другими оболочками с поддержкой подстановки процессов (ksh, bash):

{
  zcat file.tar.gz 4>&- |
    tee >({ cd /media/disk1 && tar xf -; } >&4 4>&-) |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

POSIXly в системах с/dev/fd/x:

zcat file.tar.gz | {
  {
    tee /dev/fd/3 |
      { cd /media/disk1 && tar xf -; } 3>&-
  } 3>&1 >&4 4>&- |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

Сделать if для нескольких tar.gzфайлов, вот только (еще вzsh)

for f (*.tar.gz) zcat -- $f > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

Обратите внимание, что файлы будут извлечены со скоростью самого медленного целевого диска.

Другим подходом может быть параллельное выполнение извлечения для обоих дисков (с использованием синтаксиса POSIX sh):

for f in *.tar.gz; do zcat -- $f | (cd /media/disk1 && tar xf -); done &
for f in *.tar.gz; do zcat -- $f | (cd /media/disk2 && tar xf -); done
wait

Однако обратите внимание, что:

  • это означает распаковку каждого файла дважды, что требует больше ресурсов ЦП
  • Если один целевой диск работает значительно медленнее другого, некоторые tar.gzфайлы могут в конечном итоге дважды считываться с исходного диска, так как в конечном итоге они могут быть удалены из кэша, что приведет к большему количеству операций ввода-вывода на вашем компьютере. машина.
3
28.04.2021, 23:24

Теги

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