Necesito un comando que elimine todos los archivos, carpetas y subcarpetas que no se actualizaron durante más de 31 días. Probé este
find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;
Pero si tengo una jerarquía como esta
.
├── old_sub_folder1
└── old_sub_folder2
├── old_file
└── old_sub_folder3
└── new_file
¿Dónde old_*
están las carpetas\archivos antiguos y new_file
es un archivo nuevo?
Este comando eliminará todo el contenido. Porque old_sub_folder2
la fecha no se actualizó después de new_file
su creación.
Necesito un comando que no elimine old_sub_folder2/old_sub_folder3/new_file
Respuesta1
El problema es que agregaste la -r
opción a tu rm
comando. Esto eliminará las carpetas incluso si no están vacías.
Debes hacer esto en dos pasos:
Eliminar solo elarchivos antiguos:
find . -type f -mtime +31 -delete
Para eliminar carpetas antiguas, si están vacías, podemos echar un vistazoaquíy modifíquelo un poco:
find . -type d -empty -mtime +31 -delete
Respuesta2
find . -type d ! -name . -mtime +31 -exec sh -c '
case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
"" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
esac
' {} {} \;
Desde el directorio actual lo lanzamos find
y miramos solo directories
los que no se han actualizado desde los últimos 31 días. Y en cada uno de estos directorios, a su vez, nos sumergimos y buscamos cualquier cosa que no tenga más de 31 días, y al encontrarlo hacemos eco de un carácter ficticio y también eliminamos cualquier búsqueda hacia adelante (idealmente deberíamos terminar nuestra búsqueda aquí por medio de -quit
pero no es POSIX
por eso que nos conformamos -prune
).
Luego buscamos el resultado de esta find
operación y si resulta estar vacío sabemos que ni siquiera un elemento (archivo/dir/enlace/etc.) era nuevo y por lo tanto este directorio. es seguro para su eliminación.