
En base a esta pregunta,
¿Cómo eliminar directorios según la salida "buscar"?
Intenté eliminar solo la primera carpeta del resultado haciendo:
find * -type d | head -n1 | -exec rm -rf {} \;
Pero recibo este error:
bash: -exec: command not found
¿Qué ocurre?
Respuesta1
Puedes usarlo -quit
después de usar -delete
o -exec
:
-abandonar
Salga inmediatamente. No se dejará ningún proceso secundario en ejecución, pero no se procesarán más rutas especificadas en la línea de comando.
Eliminando el primer resultado de su find
comando:
find * -type d -exec rm -Rf {} \; -quit
o
find . ! -path . -type d -exec rm -Rf {} \; -quit
Este último encontrará carpetas ocultas.
Tenga en cuenta que el resultado de su búsqueda puedeno estar ordenado alfabéticamente.
Para eliminar el primer resultado después de ordenar:
find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf
Para clasificación numérica, utilice sort -zn
.
Respuesta2
pLumo ha proporcionado adecuadamente algunas buenas soluciones alternativasen su respuesta. Estoy proporcionando un enfoque totalmente diferente.
Notarás que el find
comando, la forma en que lo estás usando para *
describir las rutas de búsqueda de nivel superior, solo se usa realmente paraencontrar el primer directorio entre los nombres que *
se expande a.
También puedes hacer esto con un bucle de shell, lo que da como resultado un código que es más fácil de leer y ver lo que hace:
shopt -s dotglob nullglob
for name in *; do
if [ -d "$name" ] && [ ! -h "$name" ]; then
rm -rf -- "$name"
break
fi
done
Este bucle, que supone que se ejecuta en un bash
shell, itera sobre todos los nombres que coinciden *
(incluidos los nombres ocultos). El cuerpo del bucle prueba si el nombre actual es un directorio (sin ser un enlace simbólico a un directorio) y, de ser así, elimina el directorio de forma recursiva antes de salir del bucle.
Se podría lograr un efecto similar en el zsh
shell con el comando mucho más simple
rm -rf -- *(D/[1])
Esto elimina el primer directorio que *
se expande. El calificador global (D/[1])
restringe la coincidencia de *
solo directorios ( /
), pero incluye nombres ocultos ( D
) y devuelve solo el primer nombre coincidente ( [1]
). Si no hay directorios en el directorio actual, recibirá un mensaje de error "no se encontraron coincidencias" del shell.
Respuesta3
Esto parece muy peligroso pero puedes intentar:
find * -type d | head -n1 | xargs rm -rf
Respuesta4
Para mí funcionó este código:
- encuentra SÓLO los archivos con -tipo f,
- filtrar archivos que no contienen ".gz"
- seleccione N archivos en este caso SOLO EL PRIMERO -n 1
código:
encontrar . -tipo f! -nombre "*.gz" | cabeza -n 1 | xargs rm-rf {};