Tengo un directorio con un par de cientos de miles de archivos.
Quiero eliminar todos los archivos, pero rm * -f informa: "lista de argumentos demasiado larga"
¿Cuál es la mejor manera de limpiar este directorio?
Tengo un directorio con un par de cientos de miles de archivos.
Quiero eliminar todos los archivos, pero rm * -f informa: "lista de argumentos demasiado larga"
¿Cuál es la mejor manera de limpiar este directorio?
Respuestas:
En el caso de que no pueda eliminar el directorio, siempre puede usar find.
find . -maxdepth 1 -type f -exec rm -f {} \;
Eso eliminará todos los archivos en el directorio actual, y solo el directorio actual (no los subdirectorios).
find dir/to/delete -delete(no genera un rmproceso por archivo para eliminar).
find dir/to/delete -type f -delete
encontrar . -maxdepth 1 -tipo f -exec rm -f {} \;
simplemente lleva demasiado tiempo (un exec de rm por archivo).
Este es mucho más eficiente:
encontrar . -maxdepth 1 -tipo f -print0 | xargs -r0 rm -f
ya que toma tantos nombres de archivos como argumentos para rm tanto como sea posible, luego ejecuta rm con la próxima carga de nombres de archivos ... puede suceder que rm solo se llame 2 o 3 veces.
ioniceantes rmes una buena idea si otras personas usan la computadora al mismo tiempo.
Ambos resolverán el problema. Hay un análisis del rendimiento respectivo de cada técnica aquí .
find . -name WHATEVER -exec rm -rf {} \;
o
ls WHATEVER | xargs rm -rf
El problema se debe a que bash expande "*" con cada elemento en el directorio. Ambas soluciones funcionan a través de cada archivo a su vez.
find . -print0 | xargs -0 rm).
ls *", y el " *" se expande a la lista de argumentos de que tu shell se queja de ser demasiado largo. Haga " ls ." en su lugar (o suba un nivel de directorio y haga " ls [dirname]").
Pude hacer esto haciendo una copia de seguridad de un nivel:
cd ..
Y corriendo:
rm directory name -rf
Y luego volver a crear el directorio.
Todas estas invocaciones de hallazgos son muy agradables, pero rara vez recuerdo exactamente la nomenclatura necesaria cuando tengo prisa: en su lugar, uso ls. Como alguien menciona, ls. funcionaría pero prefiero ls -1 como en:
ls -1 | xargs -n 100 rm -rf
La figura -n xxx es bastante segura para jugar, ya que exceder el máximo se corregirá automáticamente (si se excede size-max; vea -s) o si se excede el args-max para una aplicación, generalmente será bastante obvio.
Debe tenerse en cuenta que grep es útil para insertar en el medio de esta cadena cuando solo desea eliminar un subconjunto de archivos en un directorio grande y, por cualquier razón, no desea utilizar find.
Esta respuesta asume que está utilizando las utilidades principales de Gnu para sus ls, xargs, etc.
Aquí hay una versión para eliminar una gran cantidad de archivos cuando el sistema necesita permanecer receptivo.
Funciona emitiendo trabajo en lotes pequeños (100 archivos por defecto) y esperando un poco a que finalicen otros trabajos.
Funcionó de manera brillante para eliminar más de medio millón de archivos de un solo directorio en ext3. Imprime el porcentaje realizado como un pequeño bono
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
Resuelve errores de "argumento demasiado largo" o "no se puede asignar memoria"
Esto hizo el truco en más de 220,000 archivos en la carpeta de sesión ...
Ventaja: comienza instantáneamente a eliminar archivos
ruta de CD / a / carpeta
ls -f | xargs rm -f -v
HAGA CLIC para la captura de pantalla de los archivos que se eliminan - (eliminó todos los archivos en ~ 15 minutos)
-f (después de ls) evita la clasificación previa
-v (después de rm) muestra cada archivo como eliminado
-f (después de rm) se abre paso sin solicitar mensajes en archivos protegidos contra escritura
Consejo: Cambie el nombre de la carpeta (por ejemplo, session a session_old) primero para evitar que se agreguen archivos autogenerados adicionales mientras intenta eliminar archivos. Puede rehacer el directorio original manualmente si no lo hace automáticamente, como en mi caso