¿Cómo eliminar muchos (200 000) archivos?

17

Debo eliminar 200 000 archivos (todos ellos) de una carpeta, y no quiero eliminar la carpeta en sí.

usando rm, aparece el error "Lista de argumentos demasiado larga". Intenté hacer algo con xargs, pero no soy un Shell Guy, por lo que no funciona:

find -name * | xargs rm -f
FMaz008
fuente
55
¿Por qué no eliminar la carpeta y volver a crearla después de la eliminación?
garconcn

Respuestas:

35
$ find /path/to/folder -type f -delete
quanta
fuente
15
Probablemente valga la pena mencionar que GNU find (como lo usan la mayoría de las distribuciones de Linux) puede eliminar archivos por sí mismo usando -delete. Esto también evita problemas con archivos que contienen comillas o caracteres de nueva línea (aunque podría usar -print0las -0opciones de GNU find y GNU xarg para solucionarlo).
DerfK
3
@DerfK, buen comentario! Además, muchas personas tienden a jugar xargsmientras tanto findtiene -exec command {} +sintaxis.
poige
5

Estás haciendo todo bien. Es el '*' que le da un problema (el shell lo está expandiendo en una lista de archivos en lugar de la find). La sintaxis correcta podría ser:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(Este último es un poco menos eficiente ya que le pasará nombres más largos xargs, pero apenas notará :-))

Alternativamente, puede escapar de su '*' de esta manera (sin embargo, en ese caso también intentará eliminar también "." Y ".."; no es un problema, solo recibirá una pequeña advertencia :-)):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

Si sus nombres de archivo contienen espacios, use esto:

find . -type f -print0 | xargs -0 rm -f
dtoubelis
fuente
1
Esto no funciona si tiene un nombre de archivo que contiene un espacio.
user9517
@lain: Sí, yo estaba en un proceso de editar mi respuesta para incluir el truco para espacios blancos :-)
dtoubelis
3

El siguiente comando eliminará todos los archivos del directorio actual :

find . -type f -exec rm {} \;
George Tasioulis
fuente
2
-name '*'no significa "todos los archivos". Los archivos se dicen con:-type f
poige
2

puedes probar

find /path/to/folder -type f -print0  | xargs -0 rm -f

o

find /path/to/folder -type f -exec rm -f "{}" +
usuario9517
fuente
1

Felicitaciones a quantas responden, aquí hay algunas adiciones.

Si desea eliminar archivos con un patrón de nombre en particular, puede escribirlo así. También se agregó -print para que pueda ver lo que sucede a medida que se eliminan los archivos.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

Esto, por ejemplo, elimina todos los archivos JPEG en mydirectory.

Waltur Buerk
fuente