É possível gunzip vários arquivos para um diretório específico sem excluir os arquivos gz originais?

5

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.

    
por Bio_X2Y 29.09.2010 / 22:02

6 respostas

9

tente algo como

for a in *.gz; do gunzip -c $a > somedir/'echo $a | sed s/.gz//'; done
    
por 29.09.2010 / 22:19
2

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.

    
por 29.09.2010 / 22:27
2

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
    
por 08.05.2014 / 15:33
2

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
    
por 19.04.2013 / 18:51
0

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.

    
por 29.09.2010 / 22:17
0

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.

    
por 30.07.2011 / 13:52