Unix Tar Command com resultado da busca anterior

4

Vamos supor que temos 4 arquivos:

a.zip created on 28 feb 2018
b.zip created on 28 feb 2018
c.zip created on 2 mar 2018
d.zip created on 2 mar 2018

Eu quero pesquisar os arquivos de 28 de fevereiro e o tar.

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

Mas não está funcionando.

    
por ayush srivastava 23.07.2018 / 13:04

4 respostas

11

Com GNU ou FreeBSD find e GNU ou BSD tar :

find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
  tar -cf file.tar --null -T -

(note que exclui arquivos modificados pela última vez no nano-segundo exato 2018-02-28T00: 00: 00.000000000 (e pode incluir um arquivo no dia seguinte) que em sistemas de arquivos com nano-segundo a granularidade quase nunca aconteceria, a menos que os arquivos fossem criados com touch -t / touch -d ou fossem extraídos de arquivos que não armazenam registros de data e hora com precisão abaixo de segundos)

POSIXly e assumindo que os nomes de arquivo não contenham caracteres de nova linha (o formato de arquivo tar padrão também tem limitações extras nos nomes de arquivo):

touch -d 2018-02-28T00:00:00 .start
touch -d 2018-03-01T00:00:00 .end
find . -type f -newer .start ! -newer .end ! -path ./.start ! -path ./.end |
  pax -x ustar -w > file.tar

Se você quisesse que todos os arquivos regulares fossem modificados pela última vez em 28 de fevereiro, e não apenas em 2018, com as ferramentas GNU:

find . -type f -printf '%Tm-%Td-%p
find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
  tar -cf file.tar --null -T -
' | sed -nz 's/^02-28-//p' | tar -cf file.tar --null -T -

A saída de find -ls não é pós-processável automaticamente de forma confiável, destina-se apenas ao consumo humano.

    
por 23.07.2018 / 13:35
4

Com star , sua linha de comando parece:

touch -t201802280000 ref
star -c -f file.tar -find . -newer ref

BTW: -newermt pode ser um bom aprimoramento futuro para libfind .

Se você também gostar de uma data de término:

touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find . -newer start ! -newer end

Note que você deve omitir um segundo ou dois dias se o ano for bissexto.

Como 2018 não é um ano bissexto, você pode usar touch -t201803010000 end .

    
por 23.07.2018 / 13:48
3

Eu só quero adicionar o motivo pelo qual seu comando não está funcionando

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

A saída de find é uma lista de nomes de arquivos juntamente com outras informações, como a data. O grep produz as linhas completas com a data correspondente. Tar espera apenas os nomes dos arquivos, e espera que sejam separados por bytes nulos e não por novas linhas.

    
por 23.07.2018 / 19:12
3

find tem opções data . você tentou isso?

-newermt last modified date

-newerat last accessed date

-newerct last date that permissions changed

por exemplo: %código% EDITAR como Charles Duffy comentário , para evitar esse problema: find . -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar

    
por 23.07.2018 / 14:29

Tags