¿Cómo elimino recursivamente subdirectorios y archivos, pero no el primer directorio principal?


13

Puedo usar lo siguiente para eliminar el directorio de destino y recursivamente todos sus subdirectorios y contenidos.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Sin embargo, no quiero que se elimine el directorio de destino. ¿Cómo puedo eliminar solo los archivos en el destino, los subdirectorios y sus contenidos?

Respuestas:


11

La respuesta anterior es casi correcta. Sin embargo, no debe citar los caracteres de glob de shell si desea que funcionen. Entonces, este es el comando que estás buscando:

rm -rf "/target/directory with spaces/"*

Tenga en cuenta que el * está fuera de las comillas dobles. Este formulario también funcionaría:

rm -rf /target/directory\ with\ spaces/*

Si tiene las *comillas como se muestra arriba, solo intentará eliminar el archivo único literalmente nombrado *dentro del directorio de destino.


1
Esto no funciona con archivos y carpetas ocultos. Tuve que hacerlo una vez más con un
The Unfun Cat

8

Tres opciones más.

  1. Usar findcon -mindepth 1y -delete:

    Niveles de profundidad mínima
    No aplique ninguna prueba o acción en niveles inferiores a los niveles (un número entero no negativo).
    −mindepth 1 significa procesar todos los archivos excepto los argumentos de la línea de comandos.

    -Eliminar
    Eliminar archivos; verdadero si la eliminación se realizó correctamente. Si la eliminación falla, se emite un mensaje de error. Si −delete falla, el estado de salida de find será distinto de cero (cuando finalmente salga). El uso de −delete activa automáticamente la opción −depth.
    Pruebe cuidadosamente con la opción -depth antes de usar esta opción.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. Uso find, pero con archivos, no directorios. Esto evita la necesidad de rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Continúe y elimine el directorio principal, pero vuelva a crearlo. Puede crear una función bash para hacer esto con un comando; Aquí hay una simple línea:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

Qué tal si

rm -rf /target/directory\ path/*

Si puede haber archivos que comienzan con. en el directorio de destino.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Este segundo coincidirá con todo, comenzando con a., Excepto. y ... fallará en nombres como .a, pero eso no es muy común. Podría modificarse si es necesario para cubrir todos los casos.


Probé ambos y no funcionan para mí. ¿Quizás es porque mi ruta de directorio de destino tiene espacios? rm -rf '/ target / directorio de ruta / *' No da error, pero los subdirectorios permanecen.
Michael Prescott

Debe escapar de los espacios, ya sea con una barra diagonal inversa (\) antes del espacio, o encerrando el nombre completo del directorio entre comillas ("). Edité los ejemplos para mostrar esto.
KeithB

Gracias, lo intenté como se muestra en mi comentario anterior y todavía no voy. (Estoy usando OS X, ¿eso importa?)
Michael Prescott

OS X debería funcionar bien, eso es lo que estoy usando. Asegúrate de no usar tanto la barra diagonal inversa como las comillas. Solo uno u otro.
KeithB

Sí, solo usando las comillas. Si elimino el * y, por lo tanto, solo estoy usando rm -rf "/ target / directory path /", el directorio "directorio de ruta" se eliminará junto con los subdirectorios "directorio de ruta". Si uso el rm -rf "/ target / directory path / *", no pasa nada.
Michael Prescott

2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.