Hago esta tarea regularmente y uso variantes de lo siguiente. Es una tubería que combina varias herramientas simples: encontrar todos los archivos, anteponer el tiempo de modificación del archivo, ordenar, eliminar el tiempo de modificación del archivo, mostrar todas las líneas excepto las 500 primero y eliminarlas:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
Algunos comentarios
Si está usando "bash", debe usar "read -r file", no solo "read file".
Usar "perl" para eliminar los archivos es más rápido (y también maneja los caracteres "extraños" en los nombres de archivo mejor que el ciclo while, a menos que esté usando "leer -r archivo"):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
Algunas versiones de "tail" no admiten la opción "-n", por lo que debe usar "tail +501". Una forma portátil de saltear las 500 primeras líneas es
... | perl -wnle 'print if $. > 500' | ...
No funcionará si sus nombres de archivo contienen nuevas líneas.
No requiere encontrar GNU.
Combinar lo anterior te da:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
rm -f
.Así es como lo haría en Python 3. que también debería funcionar para otros sistemas operativos. Después de probar esto, asegúrese de descomentar la línea que realmente elimina los archivos.
fuente
No sé acerca de los "500 más nuevos", pero con find puedes eliminar cosas que tienen más de X minutos / días. Ejemplo para archivo y más de 2 días:
Prueba primero con:
Tenga en cuenta las barras invertidas y el espacio antes de "\;". Consulte la página del manual de búsqueda para obtener más información.
fuente
si pudieras mantener archivos x días / horas de antigüedad en lugar del número x más nuevo, podrías hacerlo solo con
tmpwatch --ctime 7d
fuente
Creo que el
-mtime
y-newer
opciones defind
comando son útiles para usted. Puedes verman find
para más información.fuente
por qué no usar este código más simple:
fuente