Чтобы расширить косвенность массива, строка [@]
должна быть частью переменной. Работает для значений:
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
Если вы уверены, что главный _список содержит только имена переменных, он должен быть безопасным.
Вы можете использовать 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
В 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
файлы могут в конечном итоге дважды считываться с исходного диска, так как в конечном итоге они могут быть удалены из кэша, что приведет к большему количеству операций ввода-вывода на вашем компьютере. машина.