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.

user1058398
fonte
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 {} \;
Valentin Bajrami
fonte
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.

Stéphane Chazelas
fonte
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.

calafate
fonte
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