¿Cómo eliminar todos los archivos y subdirectorios en un directorio SIN eliminar el directorio en bash?

53

¿Existe un comando para eliminar todos los archivos y subdirectorios en un directorio SIN eliminar el directorio?

Por ejemplo, si tengo el directorio "dontDeleteMe" con los subdirectorios "1", "2", "3" y cada subdirectorio tiene algunas imágenes, ¿cómo puedo eliminar los subdirectorios "1", "2" y "3" y todos los archivos en ellos, sin eliminar el directorio principal "dontDeleteMe"?

usuario784637
fuente

Respuestas:

66

Para eliminar todo en un directorio sin eliminar el directorio, escriba:

rm -rfv dontDeleteMe/*

Tenga en cuenta que la /*parte es muy importante. Si coloca un espacio antes del *, eliminará todos sus archivos en su directorio actual.

Además, tenga mucho cuidado al jugar con rm, -ry *todo en el mismo comando. Pueden ser una combinación desastrosa.

Actualización: De acuerdo, me di cuenta de que si tienes archivos ocultos / de punto [nombres de archivo con puntos al principio, ej. .hidden] Entonces esto dejará esos archivos intactos.

Entonces, realmente, la solución más simple a la pregunta original es: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Otra sería usar findla -execopción o la tubería a xargs(abajo):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

Mate
fuente
¿Puedes dar un ejemplo del uso de xargs? ¿Qué es xargs?
justingrif 01 de
@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv creo que en la mayoría de los casos esto funcionará, independientemente de los espacios, y lo que no. Pero cd /tmp/y haga un directorio de prueba y pruébelo. :)
Matt
Ah, y desde la página de manual: "xargs - construir y ejecutar líneas de comando desde la entrada estándar"
Matt
55
Volver a crear un directorio no equivale a eliminar su contenido. por ejemplo umask diferencias de permisos de directorio, las diferencias propietario, etc ... La respuesta de enzotib resolvería los problemas con su sintaxis originales
3
Esta no es una buena respuesta. Usar * es peligroso y no funcionará en archivos de puntos sin "dotglob" (ver más abajo). rm -rf dontDeleteMe && mkdir dontDeleteMeno garantiza que el directorio se vuelva a crear con los mismos permisos / propietario (s). En su lugar, use una de las find dontDeleteMe/ -mindepth 1 -deletevariantes a continuación.
Nils Toedtmann
27

La única razón por la rm -r ./*que no siempre funciona es porque puede tener archivos y / o carpetas ocultos que no coinciden *.

Para este fin, bashproporcione una opción para hacer *coincidir todo, incluso los objetos ocultos:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Puede ser útil restablecer dotglobsu estado predeterminado (sin establecer), si continúa utilizando el shell donde ejecutó los comandos anteriores:

shopt -u dotglob 
enzotib
fuente
Tampoco puede funcionar cuando tiene una gran cantidad de archivos
S ..
23

Terminal abierta ( Ctrl+ Alt+ T) hormiga escriba esto:

find somedir -mindepth 1 -delete

Esto coincidirá con todos los archivos y directorios dentro somediry niños de su (Grand-) incluyendo archivos "ocultos" punto, pero con exclusión de somedirsí mismo debido -mindepth 1, entonces -deleteellos.

guciek
fuente
¡Bienvenido a AskUbuntu! Si bien su respuesta podría ayudar al póster original, la falta de información para explicar lo que esto haría para ayudarlo hace que su respuesta sea incompleta.
Oyibo
3
Carece de explicación, pero sigue siendo la mejor respuesta. También funciona en OSX (a excepción de la forma de abrir Terminal, por supuesto).
noamtm
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Use la xdevopción para eliminar archivos solo dentro del límite del dispositivo.

Sergey
fuente
GNU find tiene -delete. Implica -depthy es más fácil de recordar que-depth -exec rm -Rf {} \;
Nils Toedtmann
4

Para eliminar (en la terminal) todos los archivos y subdirectorios, excepto el directorio base llamado "dontdelete":

rm -rf dontdelete/*
kyleN
fuente
Esto no elimina los archivos ocultos, por lo que "todos los archivos" pueden ser una declaración demasiado audaz.
Stefan van den Akker
4

Puedes usar findcon la -deletebandera:

find dontDeleteMe/* -delete

El /*es importante ya que le indica findque busque solo DENTRO de la carpeta llamada "dontDeleteMe".

También asegúrese de que la -deletebandera esté al final del findcomando.

SaultDon
fuente
1
Esta solución no elimina ningún archivo oculto, a menos que lo habilite dotglob. De lo contrario, usar la -mindepth 1opción de bandera parece ser la única forma de hacerlo funcionar.
Stefan van den Akker
3
rm -rf  directory/{.*,/*}

Que dices:

Eliminar todos los archivos que comienzan con. en "directorio" y todos los demás archivos también.

Aunque, como lo señaló Neftas, esta solución no es segura.

La solución más segura es:

 rm -rf directory/!(.|..)
Tebe
fuente
Este comando podría ser potencialmente peligroso, ya que también está incluida .y ..directorios. Esto puede evitarse cambiando {.*}a {.??*}, pero no eliminará los archivos ocultos con un solo carácter, como .a.
Stefan van den Akker
¿Qué hay de esto? rm -rf directory /! (. | ..)
Tebe
Parece una solución mucho mejor que la que se me ocurrió. ¿Puedo sugerirle que edite su respuesta?
Stefan van den Akker
sugerencia aceptada)
Tebe
1

No estoy seguro de por qué esto es tan complejo, ayúdame si me equivoco

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Eso es

usuario353305
fuente
Esto tiene la pequeña falla de intentar eliminar también el directorio actual, que, por supuesto, no funciona, porque todavía está en uso como el directorio de trabajo del shell de invocación.
David Foerster
1

Hay una respuesta aún más simple:

  1. cd dontDeleteMe

  2. rm -rf *

Tiempo de lectura de administración básica del sistema: asegúrese de prestar atención a dónde se encuentra cuando use comandos de barrido como este.

No puedo decir eso lo suficiente. Tuve que recuperar una caja porque alguien no estaba prestando atención y escribió rm -rf *mientras estaba en /.

* nix asume que si eres root o si estás sudopeando como root, sabes lo que estás haciendo. Así que asegúrese de saber lo que está haciendo antes de hacerlo.

Una alternativa que asegura que su comando 'cd' funcione antes de emitir 'rm' es usar

cd dontDeleteMe && rm -rf *
usuario30619
fuente
66
Esta es una sugerencia peligrosa. Lo que quieres es: cd dontDeleteMe && rm -rf *
Izkata
@Izkata O asegúrese de verificar que la operación de CD fue exitosa, antes de emitir el comando rm.
Eliah Kagan
1
@EliahKagan Eso es exactamente lo que hace mi fragmento de código ...
Izkata
En realidad, no es más ni menos peligroso de lo que sugieres. Todo lo que hace && es encadenar los dos comandos para que se ejecuten al mismo tiempo. En todo caso, mi método es en realidad MÁS SEGURO ya que debe detenerse y .look antes de ejecutar rm -rf *. Pausar para verificar dos veces siempre es mejor.
user30619
55
@ user30619 El &&operador no solo encadena los comandos; requiere que cada comando sea exitoso antes de que se ejecute el siguiente. Si el cdcomando falla por algún motivo (directorio no existe, privilegios, etc.), entonces el rmcomando no se ejecutará. Yo lo llamaría más seguro.
ean5533
0
  1. Lo más fácil para mí: un experto en Windows pero un novato en Ubuntu
  2. Haga clic en el ícono Archivos en el iniciador
  3. Navegue hasta el directorio donde se encuentran los archivos y carpetas que desea eliminar.
  4. Haga clic derecho en un área en blanco de la ventana al lado de los archivos y haga clic en "Abrir en la terminal" - deje abierta la ventana Archivos
  5. Se abrirá una ventana de terminal y se "establecerá" en la carpeta que localizó
  6. Puede escribir "dir" (no tenga en cuenta las comillas cuando digo tipo) y presionar enter para que el terminal muestre una lista de archivos y carpetas, solo para demostrar que está "en" la carpeta correcta
  7. escriba "rm -rf *" y presione enter
  8. dependiendo del tamaño de las carpetas / archivos para eliminar el sistema se detendrá
  9. Cuando regrese el indicador de terminal, la ventana de Archivos que había abierto ahora dirá "La carpeta está vacía"
  10. Tuve éxito con este método y me consoló ver los archivos / carpetas tanto en la ventana Archivos como como resultado del comando Dir en la ventana del terminal
  11. También me consoló que la ventana Archivos mostraba la carpeta ahora vacía, especialmente porque había estado persiguiendo estos archivos buscando la carpeta de basura en la que estaban
  12. Gracias a todos los que enviaron respuestas: fue muy informativo
William Saxon
fuente
Eso parece bastante complicado, especialmente porque terminarás corriendo de rm -rf *todos modos.
David Foerster
0
rm -rf ${PWD}/*

borrará el directorio de trabajo actual

Nick Mitchell
fuente