Cómo eliminar directorios basándose en la salida "buscar": SÓLO el primer resultado

Cómo eliminar directorios basándose en la salida "buscar": SÓLO el primer resultado

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 -quitdespués de usar -deleteo -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 findcomando:

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 findcomando, 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 bashshell, 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 zshshell 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 {};

información relacionada