tente algo como
for a in *.gz; do gunzip -c $a > somedir/'echo $a | sed s/.gz//'; done
Sei que isso pode ser feito para arquivos únicos, por exemplo,
gunzip -c my.gz > somedir/my
Pode ser feito para vários arquivos?
[UPDATE] Eu tenho um diretório com um grande número de arquivos .gz (não. Tar.gz), e eu quero gunzip-los em outro diretório, deixando os arquivos originais intocados.
Isso funcionará no bash
for FILE in *.gz
do
echo -n "File $FILE... "
gzip -c $FILE > ${FILE%.gz}
echo "Done"
done
Aproveitando a resposta de Andreja, adicionando correção para nomes de arquivos.
Supondo que cada arquivo tenha um nome como
foo.bar.gz
basename
(GNU coreutils 8.4) pode lhe dar o nome original do arquivo descompactado, assim eu faria
for f in /source/dir/*.gz; do t=$(basename $f .gz); gunzip -c $f > /target/dir/$t; done
Isso também funciona. Apenas outra maneira de fazer isso. Ele não irá manipular seus arquivos de texto extraídos. Eu realmente testei isso.
for f in *.gz; do
STEM=$(basename "${f}" .gz)
gunzip -c "${f}" > /somedir/"${STEM}";
done
Soa como trabalho para um perl / python / ruby / etc rápido. roteiro.
Basta ajustar o código neste exemplo para aplicar o comando gunzip necessário.
Esta versão preserva o tempo de filmagem original como o inplace gzip faz, e é "seguro para o espaço":
IFS=$'\n';for a in *.gz; do d='basename $a .gz';echo gunzip -c $a > somedir/$d; touch somedir/$d -r $a; done;
Eu encontrei citando "$ a" e "$ d", portanto, era desnecessário porque o bash aparecia para escapar automaticamente de espaços.
Tags command-line bash shell gunzip