comprima o arquivo usando / bin / gzip com padrões específicos

1

Eu quero compactar arquivos individualmente com o padrão específico. Por exemplo, eu tenho o diretório abaixo:

/log/log1
    -/1/log2/file.1
    -/1/log2/file123
    -/1/log2/file2.1
/log/log2
    -/2/log2/file4.1
    -/2/log2/file345
    -/2/log2/file3.1

Eu quero compactar todos os arquivos com extensão .1 dentro / log recursivamente.

O resultado será parecido com

/log/log1
    -/1/log2/file.gz
    -/1/log2/file123
    -/1/log2/file2.gz
/log/log2
    -/2/log2/file4.gz
    -/2/log2/file345
    -/2/log2/file3.gz
    
por KrunalParmar 17.04.2018 / 12:51

2 respostas

3
Solução

find + bash :

find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;

gzip opções:

  • -n - ao compactar, não salve o nome do arquivo original e o registro de data e hora por padrão
  • -c - grava saída na saída padrão; manter os arquivos originais inalterados

${1:0:-2} - bash fatiamento ; get filepath com os últimos 2 caracteres truncados

    
por 17.04.2018 / 13:25
1

Você pode fazer algo como:

find /log -name '*.1' -type f -exec sh -c '
  for file do
    gzip "$file" && mv -i "$file.gz" "${file%.*}.gz"
  done' sh {} +

Usamos o gzip file && mv -i file.gz newfile em oposição a gzip < file > newfile && rm -f file para aproveitar a capacidade do gzip de preservar alguns dos metadados no arquivo compactado e a melhor capacidade do mv -i de lidar com conflitos.

    
por 17.04.2018 / 13:39