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

IroeN
fuente

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.

StarNamer
fuente
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.

Gilles 'SO- deja de ser malvado'
fuente
Estoy usando bash
IroeN
1
@ user6554: ... que ni su pregunta ni las etiquetas utilizadas indican;)
0xC0000022L
3

Puedes correr rm */*en/var/myfolder

Dinesh
fuente
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 {} +
mikeserv
fuente
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
visón
fuente
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/*/*.

Edgar Naser
fuente
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.

rjh427
fuente
¿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 *

Keyur Bhatt
fuente