Eliminar todos los archivos creados antes de una fecha determinada

26

Tengo un directorio que contiene una gran cantidad de archivos (como registros para todos los días del año). Me gustaría eliminar todos los archivos creados antes, digamos 22/11. ¿Cómo puedo lograr eso? ¿Debo usar findentonces exec -rm? Estoy usando ksh.

usuario1058398
fuente
1
La advertencia habitual es que los sistemas de archivos Unix generalmente no contienen un registro de cuándo se creó el archivo , solo están disponibles las veces que el inodo y el contenido se modificaron por última vez.
Toby Speight

Respuestas:

35

El uso findsigue siendo la forma preferida de eliminar archivos. Ver http://mywiki.wooledge.org/UsingFind para más información.

Una forma de hacerlo es crear un archivo con la marca de tiempo. p.ej

touch -t 201311220000 /tmp/timestamp

Ahora elimine los archivos GNU find(suponiendo en el directorio actual) que coincidan con la marca de tiempo, por ejemplo:

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

o no GNU encontrar

find . -type f ! -newer /tmp/timestamp -exec rm {} \;
Valentin Bajrami
fuente
2
¿Qué hay de esto? Funciona ? find -type f -mtime +5 -exec rm -f {} \;
user1058398
1
@ user1058398 Eso eliminará archivos de más de 5 días a partir de ahora.
Valentin Bajrami
¿También elimina la carpeta junto con los archivos? @ val0x00ff
Alper
1
@Avatar no porque type -flimita la acción solo a los archivos.
Valentin Bajrami
22

Con GNU o algunos BSD find:

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

Tenga en cuenta que comprueba la última hora de modificación de los archivos. En algunos BSD, puede usar -newerBten lugar de -newermtpara comprobar el tiempo de nacimiento del inodo del archivo, si está disponible.

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

ejemplo:

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

En este caso, eliminará todos los archivos que comienzan con "ORA_XEO" con más de 15 días.

calafate
fuente
Aunque es mejor verlo con el rm -rf, el primer comando eliminaría todo lo contenido en cualquier directorio que sea anterior a esos 15 días. (Además, ¿por qué el paréntesis -name?)
ilkkachu
Tienes razón, no necesitamos poner "(" ")".
calafate
pero si queremos agregar una condición, puede ser útil. por ejemplo, si queremos eliminar todos los archivos que terminan en ".jar" o ".cp", y comenzar con "ex". example.jar- se eliminará example.cp- se eliminará example.tar- no se eliminará
calafate
en este caso podemos usar:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate
Eso eliminará algunos archivos de <número de días> en lugar de todos los archivos anteriores a <número de días> a menos que lo ejecute exactamente a la medianoche y finalice en un segundo. Con GNU find, debe usar el -daystartmodificador para forzar el -mtimevalor hasta la medianoche.
roaima