2009-08-14 21 views
21

que estoy tratando de hacer algo que es probablemente muy simple, que tienen una estructura de directorios, tales como:¿Eliminar todos los archivos pero mantener todos los directorios en un script bash?

dir/ 
    subdir1/ 
    subdir2/ 
     file1 
     file2 
     subsubdir1/ 
      file3 

me gustaría ejecutar un comando en un script bash que se eliminarán todos los archivos de forma recursiva a partir de dir abajo, pero deja todos los directorios. Es decir:

dir/ 
    subdir1/ 
    subdir2/ 
     subsubdir1 

¿Cuál sería un comando adecuado para esto?

+0

se parece más a una pregunta de superusuario para mí, ¿no le parece? –

+4

No, estoy escribiendo un script bash, eso es programación, y hay un montón de preguntas sobre scripts bash en este sitio :-) – Grundlefleck

+4

shell scripting cuenta como programación, en mi opinión –

Respuesta

38
find dir -type f -print0 | xargs -0 rm 

find lista todos los archivos que coinciden con cierta expresión en un determinado directorio, de forma recursiva. -type f coincide con los archivos comunes. -print0 es para imprimir nombres usando \0 como delimitador (como cualquier otro carácter, incluido \n, podría estar en un nombre de ruta). xargs es para recopilar los nombres de archivo de la entrada estándar y ponerlos como parámetros. -0 es asegurarse de que xargs comprenda el delimitador \0.

xargs es lo suficientemente inteligente como para llamar al rm varias veces si la lista de parámetros se hace demasiado grande. Entonces es mucho mejor que tratar de llamar a algo. como rm $((find ...). También es mucho más rápido que llamar al rm para cada archivo por sí solo, como find ... -exec rm \{\}.

+0

+1, probado como bueno :-) – Grundlefleck

+0

+1 para manejar espacios y otros caracteres "inesperados" en los nombres de archivo. – chepner

8
find dir -type f -exec rm {} \; 

donde dir es el nivel superior de la que desea eliminar archivos de

Tenga en cuenta que esto sólo eliminará los archivos regulares, no enlaces simbólicos, no los dispositivos, etc. Si desea borrar todo excepto directorios, utilice

find dir -not -type d -exec rm {} \; 
+0

+1, probado como bueno :) – Grundlefleck

+0

+1. Agregué las comillas, porque son esenciales cuando se manejan nombres de archivos que contienen espacios en blanco. – Stephan202

+0

@ Stephan202 Eso es incorrecto. ''{}' 'es lo mismo que' {} 'en lo que respecta al shell, y' find' solo ve '{}' porque el shell elimina las comillas antes de pasar los argumentos de la línea de comando a 'find'. –

8
find dir -type f -exec rm '{}' + 
+1

¿Qué es el '+'? – Grundlefleck

+3

El comando '-exec' se puede terminar de dos maneras: con un punto y coma o un signo más. Si usa un punto y coma, se genera un nuevo proceso para cada archivo.Si usa un signo más, solo se genera un proceso. (Bueno, en realidad, si la línea de comandos es demasiado larga, se generan múltiples procesos; básicamente, funciona como 'xargs' pero sin todos los problemas de cotización). Digamos que tienes dos archivos, llamados A y B. Luego, con punto y coma se engendrarían dos procesos: 'rm A' y' rm B'. Con plus, solo se genera un proceso: 'rm A B'. –

9

Con GNU de find puede utilizar la acción -delete:

find dir -type f -delete 

Con el estándar find puede utilizar -exec rm:

find dir -type f -exec rm {} + 
+0

+1 para la bandera -delete :) – Christoffer

Cuestiones relacionadas