Можно ли заархивировать несколько файлов в определенный каталог, не удаляя исходные файлы gz?
Я знаю, что это можно сделать для отдельных файлов, например,
gunzip -c my.gz > somedir/my
Можно ли это сделать для нескольких файлов?
[ОБНОВЛЕНИЕ] У меня есть каталог с большим количеством файлов.gz (не.tar.gz), и я хочу заархивировать их в другой каталог, оставив исходные файлы без изменений.
6 ответов
Попробуй что-то вроде
for a in *.gz; do gunzip -c $a > somedir/`echo $a | sed s/.gz//`; done
Это тоже работает. Просто еще один способ сделать это. Это не испортит ваши извлеченные текстовые файлы. Я действительно проверил это.
for f in *.gz; do
STEM=$(basename "${f}" .gz)
gunzip -c "${f}" > /somedir/"${STEM}";
done
Это будет работать в Bash
for FILE in *.gz
do
echo -n "File $FILE... "
gzip -c $FILE > ${FILE%.gz}
echo "Done"
done
Опираясь на ответ Андрея, добавив исправление для имен файлов.
Предполагая, что каждый файл имеет имя как
foo.bar.gz
basename
(GNU coreutils 8.4) может дать вам исходное имя несжатого файла, поэтому я бы сделал
for f in /source/dir/*.gz; do t=$(basename $f .gz); gunzip -c $f > /target/dir/$t; done
Звучит как работа для быстрого perl/python/ruby /etc. скрипт.
Просто настройте код в этом примере, чтобы применить необходимую команду gunzip.
Эта версия сохраняет исходное время файлов, как это делает gzip на месте, и "космически безопасна":
IFS=$'\n';for a in *.gz; do d=`basename $a .gz`;echo gunzip -c $a > somedir/$d; touch somedir/$d -r $a; done;
Я обнаружил, что цитирование "$a" и "$d", таким образом, было ненужным, поскольку bash, по-видимому, автоматически выходил из пробелов.