¿Cómo eliminar solo el contenido de los directorios?


14

Estoy en una carpeta: /var/myfolder.

En el interior hay algunas otras carpetas como: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/etc.

Dentro de cada uno hay algunos archivos con nombres aleatorios. ¿Cómo elimino todos los archivos de todas las carpetas dentro /var/myfolder?

La estructura (todos los directorios, por ejemplo, A, B, C, etc., dentro /var/myfolder) debe permanecer intacta.

Respuestas:


17

Tratar:

find /var/myfolder -type f -delete

Esto obtiene todos los archivos normales en / var / myfolder y los elimina dejando solo los directorios.


Gracias por la solucion. Debería haber mencionado que estoy haciendo esto en Solaris 9, por lo que mi búsqueda no tiene la opción -delete, pero ese es un buen punto de partida.
— IroeN

2
Pude encontrar una solución: find / var / myfolder -type f -exec rm -f {} \;
— IroeN

2
Lo siento. Yo uso Debian o Ubuntu. Su solución es equivalente hasta donde yo sé.
— StarNamer

66
-type f! =! -type d
— mikeserv

7

Con zsh, use el . calificador glob para hacer coincidir solo los archivos normales:

rm -- **/*(.)

Esto elimina todos los archivos regulares (no ocultos) en el directorio actual y sus subdirectorios de forma recursiva. Agregue el Dcalificador glob para eliminar archivos regulares ocultos (y archivos regulares en directorios ocultos) también.


Estoy usando bash
— IroeN

1
@ user6554: ... que ni su pregunta ni las etiquetas utilizadas indican;)
— 0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm no elimina directorios, así que simplemente ejecútelo en todo.

Para preservar enlaces simbólicos a directorios:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

Y creo que esto también debería funcionar, quizás, de una manera ligeramente optimizada si hay muchos archivos que podrían necesitar pruebas en la versión anterior:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

Tenga en cuenta que GNU findtiene una -xtypeopción para eso.
— Stéphane Chazelas

@ StéphaneChazelas - ast también lo hace. pero no necesitaba profundidad, no creo. Lo mantuve en la parte superior para evitar tantas llamadas de error, silenciadas o no, pero fue una tontería en las demás.
— mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

El eliminará todo dentro de las subcarpetas sin tocar las subcarpetas.

La primera *es para los subdirectorios del myfoldermismo ( A, B, ...). El segundo *es para los archivos enA , B, etc.

Si hay varias carpetas en el interior A, Betc. Primera carrera: rm /var/myfolder/*/*/*ejecute rm /var/myfolder/*/*.


0

También debe poder cd a la parte superior del árbol de directorios en cuestión, luego ejecutar:

find . -type f -print0 | xargs -0 rm -rf

y eso debería eliminar todos los archivos dejando el árbol de directorios intacto. Las opciones -print0 y -0 pueden omitirse si está seguro de que no tiene ningún nombre de archivo o directorio que contenga espacios.

El comando find distingue entre archivos (-tipo f) y enlaces (-tipo l), por lo que esto debería dejar los enlaces intactos, si los hay. No probado sin embargo. En caso de duda, ejecute:

encontrar . -tipo l

y vea si aparece algo antes de ejecutar el comando find anterior.


¿Puedes explicar cómo encaja la rmbandera -r, -R, --recursive - remove directories and their contents recursivelyen esto?
— Stephen Rauch

Debido a que no estamos ejecutando rm -rf, estamos ejecutando find. -tipo f y luego canaliza la salida de eso a rm -rf. Por lo tanto, solo elimina archivos, no toca los directorios. Eso es lo que el | El bit xargs lo hace, toma la salida del comando de la izquierda y la envía al comando de la derecha.
— rjh427

Exactamente mi punto. Si no está pasando ningún directorio, ¿de qué sirve una bandera que solo funciona en los directorios?
— Stephen Rauch

Porque la memoria muscular, y todavía funciona. Puede plantear la misma objeción en la opción -f "force", le daría la misma respuesta.
— rjh427

-2

Simplemente use el siguiente comando:

sudo rm -rf directory_in_which_you_have_content / *

---------------- O --------------------------------- -----------------------

El '*' significa todo, por lo tanto, cuando use *, eliminará todo el contenido. así que use un comando como este o vaya al directorio en el que desea eliminar todo el contenido y simplemente use el siguiente comando:

sudo 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.