5

Я знаю, что это можно сделать для отдельных файлов, например,

gunzip -c my.gz> somedir/my

Это можно сделать для нескольких файлов?

[ОБНОВЛЕНИЕ] У меня есть каталог с большим количеством файлов .gz (не .tar.gz), и я хочу заархивировать их в другой каталог, оставив исходные файлы без изменений.

6 ответов6

9

попробуй что-то вроде

for a in *.gz; do gunzip -c $a > somedir/`echo $a | sed s/.gz//`; done
2

Это тоже работает. Просто еще один способ сделать это. Это не испортит ваши извлеченные текстовые файлы. Я действительно проверил это.

for f in *.gz; do
  STEM=$(basename "${f}" .gz)
  gunzip -c "${f}" > /somedir/"${STEM}";
done
2

Предполагая, что каждый файл имеет имя как

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
2

Это будет работать в Bash

for FILE in *.gz
do
    echo -n "File $FILE... "
    gzip -c $FILE > ${FILE%.gz}
    echo "Done"
done

Опираясь на ответ Андрея, добавив исправление для имен файлов.

0

Эта версия сохраняет исходное время файла, как это делает 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, по-видимому, автоматически выходил из пробелов.

0

Звучит как работа для быстрого perl/python/ruby/etc. скрипт.

Просто настройте код в этом примере, чтобы применить необходимую команду gunzip.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .