Можно ли разархивировать несколько файлов в определенный каталог, не удаляя исходные файлы gz?

10554
Bio_X2Y

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

gunzip -c my.gz> somedir / my

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

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

5

6 ответов на вопрос

9
Nifle

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

for a in *.gz; do gunzip -c $a > somedir/`echo $a | sed s/.gz//`; done 
Удалил мой пост .. Твой однострочник попроще :) Andrejs Cainikovs 13 лет назад 0
Базовое имя может быть немного проще: для в * .gz; do zcat $ a> somedir / `basename $ a`; сделанный Neil 13 лет назад 0
Спасибо, Нил, но базовое имя $ a не работает для меня в bash на Mac, как показано выше - возможно, некоторые знаки препинания отсутствуют? Bio_X2Y 13 лет назад 0
Спасибо Андрейс, Нифле, Нил. Эта команда делает свое дело. Bio_X2Y 13 лет назад 0
Базовое имя $ необходимо сказать, чтобы удалить .gz. следовательно: basename $ a .gz Andy Lee Robinson 12 лет назад 0
Опция basename не работает Andy 11 лет назад 0
2
Rich Homolka

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

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

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

Забыл добавить точки с запятой;) Andrejs Cainikovs 13 лет назад 0
Извините, куда именно они идут? :) Bio_X2Y 13 лет назад 0
Хм .. после каждой команды в цикле? :) эхо; GZIP; эхо; сделанный... Andrejs Cainikovs 13 лет назад 0
Ах, да, я пропустил тот, прежде чем первый "сделать"! Это работает для меня, если я обновлю использование gunzip и вставлю целевой каталог. Требуется дополнительная работа для удаления «.gz» из целевых несжатых файлов. Благодарю. Bio_X2Y 13 лет назад 0
Это извлекает мои текстовые файлы из файлов .gz все искаженные. Andy 11 лет назад 0
2
Andy

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

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

Assuming that each file has a name like

foo.bar.gz 

basename (GNU coreutils 8.4) can give you the original uncompressed file's name, thus I'd do

for f in /source/dir/*.gz; do t=$(basename $f .gz); gunzip -c $f > /target/dir/$t; done 
0
Sanjay Sheth

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

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

0
Andy Lee Robinson

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

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