Removendo arquivos com mais de 7 dias

79

Eu escrevo abaixo o comando para excluir todos os arquivos com mais de 7 dias, mas não funciona:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Como posso remover esses arquivos?

Malihe Pakyari
fonte
5
Deve haver um espaço entre namee '*.gz'.
24415 Jos

Respostas:

136

Como o @Jos apontou, você perdeu um espaço entre namee '*.gz'; também para acelerar o uso de comando -type fopção para executar o comando em f iles somente.

Portanto, o comando fixo seria:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Explicação:

  • find: O comando UNIX para encontrar f iles / d irectories / l tintas e etc.
  • /path/to/: o diretório para iniciar sua pesquisa.
  • -type f: encontre apenas arquivos.
  • -name '*.gz': lista os arquivos que terminam com .gz.
  • -mtime +7: considere apenas aqueles com tempo de modificação superior a 7 dias.
  • -execdir ... \;: para cada resultado encontrado, execute o seguinte comando em ....
  • rm -- '{}': remova o arquivo; a {}parte é onde o resultado da busca é substituído pela parte anterior. --significa que os parâmetros de fim de comando evitam o erro dos arquivos iniciados com hífen .

Como alternativa, use:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

Do homem encontre :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

O que é um pouco mais eficiente, porque equivale a:

rm file1 file2 file3 ...

em oposição a:

rm file1; rm file2; rm file3; ...

como no -execmétodo


Um comando alternativo e também mais rápido é usar o +terminador do exec em vez de\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Este comando será executado rmapenas uma vez no final, em vez de cada vez que um arquivo for encontrado e esse comando é quase tão rápido quanto usar a -deleteopção como a seguir find:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete
αғsнιη
fonte
3
Por que eu não iria direto -deleteno final? Por que mexer com o +ou \;?
rain01
3
@ rain01 plz ler unix.stackexchange.com/q/167823/72456
αғsнιη
2

Cuidado ao remover arquivos com o find. Execute o comando com -ls para verificar o que você está removendo

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Em seguida, retire o comando do histórico e acrescente-exec rm {} \;

Limite o dano que um comando find pode causar. Se você deseja remover arquivos de apenas um diretório, -maxdepth 1impede a localização de percorrer subdiretórios ou de pesquisar no sistema completo se você digitar /media/bkfolder /.

Outros limites que adiciono são argumentos de nome mais específicos -name 'wncw*.gz', como adicionar um horário mais recente -mtime -31e citar os diretórios pesquisados. Isso é particularmente importante se você estiver automatizando as limpezas.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

Zeke
fonte