Script Bash para excluir arquivos com mais de x dias com subdiretórios

36

Estou tentando excluir uma tonelada de arquivos com mais de x dias.

Agora eu tenho um script para fazer isso

find /path/to/files* -mtime +10 -exec rm {} \; 

Mas isso também excluirá os subdiretórios. Há uma tonelada de pastas, mas eu gostaria de mantê-las e excluir os arquivos com mais de 10 dias dentro das pastas mencionadas.

Existe uma maneira de fazer isso?

    
por JoyIan Yee-Hernandez 05.01.2012 / 17:18

6 respostas

50

type opção para filtrar resultados

find aceita a opção type para selecionar, por exemplo, apenas arquivos.

find /path/to/files -type f -mtime +10 -delete

Deixe de fora -delete para mostrar o que ele excluiria e, depois de verificar isso, siga em frente e execute o comando completo.

Isso só seria executado em arquivos, não em diretórios. Use -type d para o inverso, listando apenas os diretórios que correspondem aos seus argumentos.

Opções adicionais

Você pode querer ler man find , pois há mais opções que você pode precisar no futuro. Por exemplo, -maxdepth permitiria restringir somente os itens encontrados a uma profundidade específica, por exemplo, -maxdepth 0 não recorre aos subdiretórios.

Algumas observações

  • Gostaria de saber como o comando teria removido uma pasta, já que você não pode remover uma pasta com rm apenas. Você precisaria de rm -r para isso.

  • Além disso, /path/to/files* é confuso. Você quis dizer /path/to/files/ ou espera que o curinga seja expandido para vários nomes de arquivos e pastas?

  • Coloque o {} entre aspas simples, ou seja, '{}' para evitar que o nome do arquivo / diretório substituído seja interpretado pelo shell, assim como protegemos o ponto-e-vírgula com uma barra invertida.

por 05.01.2012 / 17:23
5

Como nas respostas anteriores (+1 para ambos), o truque é usar o predicado -type f .

Note que, em vez de -exec rm '{}' , você também pode usar o predicado -delete . Mas não faça isso. Com -exec rm '{}' você pode (e deve) primeiro fazer -exec echo rm '{}' para verificar se é realmente o que você deseja. Depois disso, execute novamente o comando sem o echo .

Usar -delete é mais rápido (sem fork() e execve() extra para cada arquivo), mas isso é arriscado porque -delete também funciona como condição, por isso:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

mas se você apenas trocar argumentos:

# delete ALL files
find . -type f -name '*.tmp' -delete

Se você precisar que find e rm trabalhem mais rápido para vários arquivos, confira o idioma find ... | xargs ... rm UNIX.

    
por 05.01.2012 / 18:33
1

Você pode facilmente fazer isso com o comando find

$ find -type f

Que restringe os resultados ao arquivo de tipos

    
por 05.01.2012 / 17:23
1

Eu estava me esforçando para fazer isso direito usando os scripts fornecidos acima e alguns outros scripts, especialmente quando os nomes de arquivos e pastas tinham nova linha ou espaços.

Finalmente tropecei no tmpreaper e tem funcionado muito bem para nós até agora.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Original link

Tem recursos como test, que verifica os diretórios recursivamente e os lista. Capacidade de excluir links simbólicos, arquivos ou diretórios e também o modo de proteção para um determinado padrão ao excluir

    
por 20.02.2014 / 12:26
0

Para acelerar o comando, use '+' em vez de \;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Isso executará rm somente uma vez no final, em vez de cada vez que um arquivo for encontrado.
( rm pode ser executado várias vezes se você tiver realmente muitos arquivos devido à limitação de comprimento da linha de comando, mas isso ainda é quase tão rápido quanto usar -delete )

    
por 05.01.2012 / 18:56
0

rm -f find /path/to/files -type file -mtime -5

Isso excluirá os arquivos que foram modificados em 5 dias

rm -f find /path/to/files -type file -mtime +5

Isso excluirá os arquivos que foram modificados antes de 5 dias

Use 'antes de encontrar e no final depois de 5'.

    
por 30.09.2014 / 11:49

Tags