Excluir arquivos mais antigos que o arquivo específico

14

Eu preciso excluir de uma pasta todos os arquivos anteriores a um arquivo específico.
Executando o bash no CentOS 7.

Eu tenho uma solução para isso, mas acho que deve haver uma maneira mais elegante de fazê-lo:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done
csny
fonte

Respostas:

28

Eu não tentei, mas finddeve ser capaz de lidar com toda a operação muito bem:

$ find dir/ -type f ! -newer reference -delete

... ou ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Basicamente:

  • ! -newer referencecorresponde aos arquivos que foram modificados menos recentemente que reference.
  • -delete os exclui.
  • ! -name referenceexclui reference, caso também esteja localizado abaixo dir/e você queira mantê-lo.

Isso deve excluir todos os arquivos anteriores referencee localizados em dir/.

John WH Smith
fonte
2
Perfeito :). Apenas adicionado -maxdepth 1para manter a pesquisa não recursiva
csny
3
! -newersignifica "não mais novo", então "mais velho ou a mesma idade "; o arquivo em si será correspondido se estiver no caminho find, apenas algo a ser lembrado.
Ferada 14/05
1
@ferada Não será excluído, e é por isso que a minha resposta também inclui ! -name reference(veja o terceiro marcador).
John WH Smith
7

comparar tempos de modificação de arquivo com test, usando -nt(mais recente que a) e -ot(acima de) operadores:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi
serenesat
fonte
2
Obrigado, isso é melhor do que a minha solução, mas você ainda precisar iterar todos os arquivos na pasta e comparar ... A outra resposta é ainda mais elegante
csny