Eliminar todos los archivos de forma recursiva sin eliminar directorios

10

Quiero "limpiar" todos los archivos de un directorio, incluidos todos los archivos en subdirectorios, pero quiero dejar los subdirectorios en su lugar. Tengo entendido rm -rque también eliminará los subdirectorios.

Yo no deseo borrar los archivos ocultos (punto).

¿Cómo se puede hacer esto?

Scott Wilton
fuente
1
find -type f ! -name "[.]*" -delete¿no es adecuado?
Costas
No lo sé. ¿Eso hace lo que te pido?
Scott Wilton
Pruébelo sin -deleteél, solo imprima los nombres de archivo para eliminar.
Costas
¿Desea eliminar archivos (ocultos o no) en directorios ocultos?
Stéphane Chazelas
¿Qué pasa con los enlaces simbólicos a los directorios?
Stéphane Chazelas

Respuestas:

10

Uso findpara eso:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
fuente
1
No todas las implementaciones de búsqueda tienen-delete
wurtel
3
@RomeoNinov por favor lea la pregunta de OP:I do not want to delete hidden (dot) files.
jimmij
1
@Costas, no, no hay shell que requiera escapar +(al menos no en las familias Bourne, csh o rc). Hay una leyenda que dice que algunas versiones antiguas de cshescapes requeridos, {}pero nunca me he encontrado con eso.
Stéphane Chazelas
1
@ScottWilton Los directorios ocultos están incluidos, pero los archivos ocultos en directorios ocultos no. Si desea rechazar todos los archivos en directorios ocultos, entonces find . ! -name '.*' ! -type d ! -path '*/.*'debe hacer el trabajo.
jimmij
1
@jimmy, más me gusta find . -name '.?*' -prune -o ! -type d -exec rm {} +evitar descender por completo. Tenga en cuenta que --no es necesario aquí (aunque no hace daño) ya que las rutas comienzan con ./.
Stéphane Chazelas
0

prueba algo como:

find <path> ! -name '.*' -type f -exec rm {} \;
Romeo Ninov
fuente
¿Alguna razón por la que eliminar los archivos uno a la vez en lugar de acelerar las cosas .... -exec rm {} + ?
Anthon
Prefiero hacer las cosas una por una. Las operaciones masivas (y paralelas) tienen algún tiempo efectos secundarios extraños (y desagradables) (como hacer una gran carga en el subsistema de E / S)
Romeo Ninov
1
-exec rm {} +no es paralelo, solo llama rmcon varios nombres de archivo. Ejecuta menos rminvocaciones, por lo que es más amigable con los recursos. Si es un poco menos seguro porque amplía la ventana de carrera dentro de la cual un componente de directorio de los archivos para eliminar puede cambiarse a un enlace simbólico. Pero solo -deleteo -execdir rm {} \;abordaría completamente eso.
Stéphane Chazelas
@ StéphaneChazelas, ninguno de estos (-delete o -execdir) existe en UNIX. Y no veo en cuestión que se mencione linux!
Romeo Ninov
@RomeoNinov, sí, dije en otro comentario aquí que solo -execes estándar. -deletey -execdirviniendo de BSDs, sin embargo, GNU los agregó unos 10 años después. En cualquier caso, eso no tiene nada que ver con Linux, que es solo un núcleo.
Stéphane Chazelas