¿Cuál es el comando para eliminar todos los archivos pero no los directorios?

23

Digamos que tengo un árbol de directorios como este:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Si lo usara rm -r FOLDER/*, todo en FOLDER se eliminaría, incluidos los subdirectorios. ¿Cómo puedo eliminar todos los archivos en FOLDER y en sus subdirectorios sin eliminar directorios reales?

PKM
fuente

Respuestas:

37

Lo que intenta hacer es la eliminación recursiva. Para eso necesitas una herramienta recursiva, como find.

find FOLDER -type f -delete
Sergiy Kolodyazhnyy
fuente
13

Con bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Aquí iterando sobre los nombres de archivo expandidos globalmente y eliminando solo archivos.

Lo anterior es en seco, si está satisfecho con los cambios que se realizarán, elimine echopara la eliminación real:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Finalmente, desarmar globstar:

shopt -u globstar

Con zsh, aprovechando el calificador global:

echo -- FOLDER/**/*(.)

(.) es el calificador glob, que limita las expansiones glob a solo archivos regulares.

Lo anterior solo imprimirá los nombres de los archivos, para su eliminación real:

rm -- FOLDER/**/*(.)
heemayl
fuente
2
+1 para zsh globbing. Más personas deberían ser conscientes de las cosas increíbles que puede hacer zsh.
marcelm
11

Si su versión de findno es compatible -delete, puede usar lo siguiente para eliminar cada archivo en el directorio actual y debajo.

find . ! -type d -exec rm '{}' \;

fuente
-exec rm {} +sería más rápido, especialmente si hay muchos archivos.
muru
Y también find . ! -type d -exec rm {} +elimina enlaces sym.
Justicia para Mónica el
1
@muru: Si una implementación particular de findno es compatible -delete, probablemente tampoco -exec ... {} +sea compatible . La forma recomendada de lidiar con eso es find ... -print0 | xargs -r0 rm(si se esperan muchas coincidencias potenciales).
David Foerster
55
@DavidFoerster no realmente. -exec ... {} +es POSIX, pero -deleteno lo es. (Tampoco lo es -print0, por cierto.)
Muru
@muru: bastante justo. He encontrado al menos dos findimplementaciones que no son POSIX que son compatibles -print0pero no -exec ... {} +(aunque no recuerdo -delete). Uno estaba en OS X, el otro en Solaris (hace unos años en un sistema actualizado muy conservador). También puedes sustituir -print0con -printf '%p\0'. De todos modos, esto es Ask Ubuntu y no Unix & Linux y Ubuntu usa GNU find desde siempre.
David Foerster