En Unix, ¿cómo se elimina todo en el directorio actual y debajo de él?

Respuestas:

166

Practica la informática segura. Simplemente suba un nivel en la jerarquía y no use una expresión comodín:

cd ..; rm -rf -- <dir-to-remove>

Los dos guiones --indican rmque <dir-to-remove>no es una opción de línea de comandos, incluso cuando comienza con un guión.

tvanfosson
fuente
8
¿Por qué es esto más seguro?
Yen
34
Porque está haciendo coincidir específicamente un directorio con nombre y, por lo tanto, es menos probable que elimine algo que no desea eliminar.
tvanfosson
5
Cierto. Podía verme haciendo eso con bastante facilidad.
Yen
26
¿No borra el directorio en sí también? Tienes que hacer mkdir <dir-to-remove> después. Pero luego, cualquier enlace físico que haga referencia a ese directorio será un directorio distinto después.
Johannes Schaub - litb
5
@Yen, si lo usa rm ./, podría escribir accidentalmente, lo rm . /que podría ser un desastre.
irfandar
44

Eliminará todos los archivos / directorios debajo del actual.

find -mindepth 1 -delete

Si desea hacer lo mismo con otro directorio cuyo nombre tiene, puede simplemente nombrarlo

find <name-of-directory> -mindepth 1 -delete

Si desea eliminar no solo los subdirectorios y archivos del mismo, sino también el directorio en sí, omita -mindepth 1. Hágalo sin el -deletepara obtener una lista de las cosas que se eliminarán.

Johannes Schaub - litb
fuente
Necesitaba eliminar todos los archivos de los subdirectorios, pero no quería eliminar los propios subdirectorios. find <name-of-direcotry> -mindepth 2 -delete funcionó muy bien!
Tim Dearborn
Necesita -mindepth 1si está especificando un directorio ( find <name-of-directory> -mindepth 1 -delete). De lo contrario, Johannes tiene razón, no eliminará el directorio de trabajo actual (cuando se use find -delete).
Weboide
En mi opinión, esta es la mejor respuesta, especialmente en los scripts.
wizonesolutions
1
Probé: find -mindepth 1 -deletepero tengo illegal option -- mpero funcionó muy bien cuando me quité la opción mindepth find . -delete
Sharon
41

Lo que siempre hago es escribir

rm -rf *

y luego presione ESC- * , y bash expandirá el * a una lista explícita de archivos y directorios en el directorio de trabajo actual.

Los beneficios son:

  • Puedo revisar la lista de archivos para eliminar antes de presionar ENTER.
  • El historial de comandos no contendrá "rm -rf *" con el comodín intacto, que luego podría reutilizarse accidentalmente en el lugar equivocado en el momento equivocado. En cambio, el historial de comandos tendrá los nombres de archivo reales allí.
  • También se ha vuelto útil una o dos veces responder "espera un segundo ... ¿qué archivos acabo de eliminar?". Los nombres de los archivos son visibles en el búfer de retroceso del terminal o en el historial de comandos.

De hecho, me gusta tanto que lo he convertido en el comportamiento predeterminado para TAB con esta línea en .bashrc:

bind TAB:insert-completions
Ville Laurikari
fuente
¿Falta --esta respuesta? Este enfoque es impresionante en general, debo decir.
Ben Voigt
mejor manera es ejecutar esto con sudo
Abbas Torabi
22

Utilizar

rm -rf *

Actualización: .significa directorio actual, pero no podemos usarlo. El comando parece tener comprobaciones explícitas para .y ... Utilice el comodín globbing en su lugar. Pero esto puede resultar arriesgado.

Una versión más segura de la OMI es usar:

rm -ri * 

(esto le solicita confirmación antes de eliminar cada archivo / directorio).

dirkgently
fuente
13
"Puede ser arriesgado" es maravillosamente lacónico.
5
Al hacer cosas como esta, he encontrado un ls -r rápido. primero le permite ver lo que va a eliminar. Útil para dar una idea rápida de que no va a eliminar todo el disco ...
Rich Bradshaw
2
¿Por qué es más arriesgado que rm -rf <subdir-name>?
Yen
2
@Yen - porque si lo haces en el lugar equivocado puedes obtener resultados desastrosos. Usar un nombre específico en el lugar incorrecto solo puede salir mal si el mismo subdirectorio existe allí.
tvanfosson
1
No es posible eliminar al padre mientras reside en el hijo.
dirkgently
6

Es correcto que rm –rf .eliminará todo en el actual directamente, incluidos los subdirectorios y su contenido. El único punto ( .) significa el directorio actual. tenga cuidado de no hacerlo rm -rf ..ya que el punto doble ( ..) significa el directorio anterior.

Dicho esto, si usted es como yo y tiene múltiples ventanas de terminal abiertas al mismo tiempo, será mejor que esté seguro y use rm -ir .Veamos los argumentos del comando para entender por qué.

Primero, si observa la rmpágina de comando man ( man rmen la mayoría de Unix), nota que –rsignifica "eliminar el contenido de los directorios de forma recursiva". Por lo tanto, hacerlo rm -r .solo eliminaría todo en el directorio actual y todo lo que está debajo.

En rm –rf .el agregado -f significa "ignorar archivos inexistentes, nunca preguntar". Ese comando elimina todos los archivos y directorios en el directorio actual y nunca le pide que confirme que realmente desea hacerlo. -fes particularmente peligroso si ejecuta el comando con un usuario con privilegios, ya que podría eliminar el contenido de cualquier directorio sin tener la oportunidad de asegurarse de que eso sea realmente lo que desea.

Por otro lado, en rm -ri .el -ique reemplaza los -fmedios "preguntar antes de cualquier eliminación". Esto significa que tendrás la oportunidad de decir "¡oups! Eso no es lo que quiero" antes de que rm borre felizmente todos tus archivos.

En mis primeros días de administrador de sistemas, hice un rm -rf /en un sistema mientras estaba conectado con todos los privilegios (root). El resultado fue que pasaron dos días restaurando el sistema desde las copias de seguridad. Es por eso que ahora empleo rm -riahora.

Pierre-Luc Simard
fuente
6

Qué tal si:

rm -rf "$(pwd -P)"/* 

fuente
27
jQuery es tan poderoso.
Pawel
5
rm  -rf * 

¡No lo hagas! ¡Es peligroso! ¡ASEGÚRESE DE ESTAR EN EL DIRECTORIO CORRECTO!

nkassis
fuente
4

hacer seguro de que estás en el directorio correcto

rm -rf *
digitaljoel
fuente
2
Esto no elimina archivos o subdirectorios cuyo nombre comience con un punto.
1
cierto. en mis pruebas, tampoco rm -rf. tvanfosson tiene la mejor solución en mi opinión con su "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

Esta solución general y segura más simple es probablemente:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
devnev
fuente
1

Creo que esta respuesta es mejor:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Si se llama a su directorio de nivel superior images, ejecute rm -r images/*. Esto usa el operador de shell glob *para ejecutar rm -ren cada archivo o directorio dentro de las imágenes.

básicamente subes un nivel y luego dices eliminar todo dentro del directorio X. De esta manera, todavía está especificando qué carpeta debe eliminar su contenido, lo cual es más seguro que simplemente decir 'eliminar todo aquí', mientras se conserva la carpeta original (que a veces desea porque no está permitido o simplemente no desea para modificar los permisos existentes de la carpeta)

Francisco Noriega
fuente