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

Другие вопросы по тегам