Remova todos os arquivos criados antes de uma certa data


26

Eu tenho um diretório que contém um grande número de arquivos (como logs para todos os dias do ano). Gostaria de remover todos os arquivos criados antes, digamos 22/11. Como posso conseguir isso? Devo usar o findexec -rm? Estou usando o ksh.


1
A ressalva usual é que os sistemas de arquivos Unix geralmente não contêm um registro de quando o arquivo foi criado - apenas as horas em que o inode e o conteúdo foram modificados pela última vez estão disponíveis.
perfil completo de Toby Speight

Respostas:


35

O uso findainda é a maneira preferida de excluir arquivos. Veja http://mywiki.wooledge.org/UsingFind para obter mais informações.

Uma maneira de fazer isso é criar um arquivo com o carimbo de data / hora. por exemplo

touch -t 201311220000 /tmp/timestamp

Agora exclua os arquivos GNU find(assumindo no diretório atual) que correspondem ao carimbo de hora, por exemplo:

find . -type f ! -newer /tmp/timestamp -delete  

ou não GNU encontrar

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
E isso? Funciona ? encontre -type f -mtime +5 -exec rm -f {} \;
user1058398

1
@ user1058398 Isso excluirá arquivos com mais de 5 dias a partir de agora.
Valentin Bajrami

Ele também exclui a pasta junto com os arquivos? @ val0x00ff
alper

1
@Avatar não, porque isso type -flimita a ação apenas aos arquivos.
Valentin Bajrami

22

Com o GNU ou alguns BSD finds:

find . ! -newermt 2013-11-22 ! -type d -delete

Observe que ele verifica a hora da última modificação dos arquivos. Em alguns BSDs, você pode usar -newerBtno lugar de -newermtpara verificar o tempo de nascimento do inode do arquivo, se disponível.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

exemplo:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

Nesse caso, ele removerá todos os arquivos que começam com "ORA_XEO" com mais de 15 dias.


Embora seja melhor assistir com o rm -rfcomando, o primeiro comando removeria tudo o que estiver contido em qualquer diretório anterior a esses 15 dias. (Além disso, por que o torno parêntese -name?)
ilkkachu

Você está certo, não precisamos colocar "(" ")".
calafate

mas se quisermos adicionar uma condição, ela pode ser útil. por exemplo, se queremos remover todos os arquivos que terminam com ".jar" ou ".cp" e inicie com "ex". example.jar- ele será removido example.cp- ele será removido example.tar- que costuma ser removido
calafate

neste caso, podemos usar:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

Isso removerá alguns arquivos do <número de dias> em vez de todos os arquivos anteriores a <número de dias>, a menos que você o execute exatamente à meia-noite e termine em um segundo. Com o GNU, findvocê deve usar o -daystartmodificador para coagir o -mtimevalor à meia-noite.
roaima
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.