Comprime o resultado ls usando tar

0

Eu quero compactar arquivos de log por meses específicos. Listando todos os arquivos com os seguintes comandos

ll | grep 'Sep' | grep 'oim_server'

Então eu preciso compactar com o resultado do tar dele Como posso fazer isso?

    
por Furkan 10.10.2016 / 15:06

2 respostas

1

Encontre todos os arquivos modificados em setembro:

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01

Anexar um arquivo a um arquivo:

tar -rvf archive.tar filename

Agora combine os dois usando exec:

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01 -exec tar -rvf logs_sept.tar {} +
    
por 10.10.2016 / 16:12
2

Se você quiser arquivar os arquivos não ocultos (de qualquer tipo, incluindo o diretório) modificados pela última vez em setembro de qualquer ano e cujo nome contenha oim_server (que parece ser a intenção de seu comando ll | grep 'Sep' | grep 'oim_server' ) um também corresponderia ao destino user / group / filename / symlink contendo Sep ou oim_server ), em um sistema GNU, você poderia fazer:

find . -mindepth 1 -maxdepth 1 ! -name '.*' \
       -name '*oim_server*' -printf '%Tm:%p
ll | grep Sep | grep oim_server |
  awk '{print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz
' | sed -zn 's/^09://p' | tar --null --no-recursion -T - -cvvf - | xz > file.tar.xz

( --no-recursion sendo não também arquiva o conteúdo desses diretórios modificados pela última vez em algum mês de setembro).

Observe que tar não é compactado, apenas arquiva (agrupa arquivos com dados e metadados juntos em uma fita ou arquivo para que possam ser restaurados como é mais tarde). Você canaliza sua saída para um compressor como xz acima para obter um archive compactado. Algumas implementações de tar , como o GNU tar , podem chamar esses compressores sozinhos ( -J / --xz para xz de compactação nas versões recentes do GNU tar ).

Se você quisesse arquivar os arquivos exibidos na saída de seu ls filtrado, você faria:

ll | awk '/Sep/ && /oim_server/ {print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz

Que você pode simplificar para:

find . -mindepth 1 -maxdepth 1 ! -name '.*' \
       -name '*oim_server*' -printf '%Tm:%p
ll | grep Sep | grep oim_server |
  awk '{print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz
' | sed -zn 's/^09://p' | tar --null --no-recursion -T - -cvvf - | xz > file.tar.xz

No entanto, observe que há algumas limitações:

  • O grep Sep pesquisa Sep na linha inteira, não apenas no campo do mês. Isso inclui o nome do usuário e do grupo, o nome do arquivo e o destino dos links simbólicos.
  • Sep será usado para arquivos modificados pela última vez em setembro somente em algumas localidades em inglês.
  • como para Sep acima do oim_server encontrado em qualquer lugar da linha
  • os nomes de arquivos podem conter caracteres de nova linha, portanto, supondo que um nome de arquivo esteja apenas em uma linha, está errado no caso geral.
  • pior, awk '{print $NF}' imprime a última palavra de cada linha. Isso significa que não funcionará para nomes de arquivos contendo espaços em branco ou para links simbólicos (onde será gerada a última palavra do destino do symlink)
por 10.10.2016 / 16:47