2012-09-19 20 views
8

Tengo directorios temporales llenos de basura que todos comienzan con __temp__ (por ejemplo, __temp__user_uploads), que deseo eliminar con una función de limpieza. Mi intento función es ejecutar:¿Cómo puedo usar el comando `find` en Linux para eliminar directorios no vacíos?

find . -name __temp__* -exec rm -rf '{}' \; 

Si funciono con el comando y hay múltiples __temp__ directorios (__temp__foo y __temp__bar), consigo la salida:

find: __temp__foo: unknown option 

Si funciono con el comando y hay está a sólo 1 __temp__ directorio (__temp__foo), se elimina y me da la salida:

find: ./__temp__foo: No such file or directory 

¿Por qué no funciona el comando, por qué es inconsistente y cómo puedo solucionarlo?

Respuesta

25

Utilice una búsqueda y cotización primero en profundidad (o escape) del metacarácter cáscara *:

find . -depth -name '__temp__*' -exec rm -rf '{}' \; 

Explicación

Sin la bandera -depth, su comando find eliminará nombre de archivo coincidentes y luego tratar para descender a los directorios (ahora desvinculados). Ese es el origen de "No such such file or directory" en su único caso de directorio __temp__.

Sin citar o escapar del *, el shell expandirá ese patrón, haciendo coincidir varios nombres de archivo __temp__whatever en el directorio de trabajo actual. Esta expansión confundirá find, que está esperando opciones en lugar de nombres de archivo en ese punto en su lista de argumentos.

+6

Como una mejora de la eficiencia y la hermeticidad, asumiendo las utilidades de GNU (ya que el OP está en Linux), en realidad recomendaría 'find. -maxdepth 1 -type d -name '__temp __ *' -print0 | xargs -0 rm -rf'. – pilcrow

+0

+1 por sugerir xargs en lugar de -exec –

+0

@AshishKumar: ¿por qué +1 para xargs? ¿'-exec' no es una buena característica de' encontrar'? pilcrow, gracias por la explicación! – orokusaki

Cuestiones relacionadas