-delete
implica -depth
que no funciona con -prune
( -depth
comienza con las hojas). Hay una advertencia al respecto en el manual de la versión de GNU ( -delete
es una extensión de FreeBSD que ahora también es compatible con GNU find
y algunas otras implementaciones).
info find --index-search=-delete
El uso de la acción '-delete' en la línea de comando activa automáticamente la opción '-depth' (* note find Expressions: :). Esto puede ser sorprendente si anteriormente solo estaba probando con '-print', por lo que generalmente es mejor recordar usar '-depth' explícitamente.
info find --index-search=-prune
Debido a que '-delete' implica '-depth', usar '-prune' en combinación con '-delete' puede resultar en la eliminación de más archivos de los que pretendía.
Aquí, tienes la opción de usar en su rm
lugar:
find . -name save -prune -o -type f -exec rm -f {} +
(potencialmente inseguro si hay un directorio que otros puedan escribir allí, ya que uno podría hacer que elimine archivos fuera del árbol de directorios actual al reemplazar los directorios con enlaces simbólicos mientras ejecuta ese comando).
Una alternativa más segura:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
Eso no tiene el problema mencionado anteriormente, pero significa ejecutar uno rm
por archivo. El --
es necesario para la implementación de FreeBSD, no el GNU que prefija los nombres de archivo ./
.
Alternativamente, como lo sugiere Costas:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(pero eso aún desciende innecesariamente en save
directorios)
El LC_ALL=C
está allí, por lo que *
coincide con cualquier secuencia de bytes (incluso aquellos que no forman caracteres válidos en la configuración regional actual). Tenga en cuenta que afectará el idioma de los mensajes de error (inglés en lugar del idioma del usuario).
mv save/ ../some/safer/location
antes de un comando de eliminación "genérico" (... pero, por supuesto, antes de su publicación, habría hecho la misma verificación y me encontré con el mismo problema). Ahora ve a buscar un buen "recuperar" para el sistema de archivos donde estaban los archivos ^^