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