2009-05-04 15 views
101

Sé que esto borrará todo en un subdirectorio y debajo de él:En Unix, ¿cómo se elimina todo en el directorio actual y debajo de él?

rm -rf <subdir-name> 

Pero, ¿cómo borro todo en el directorio actual, así como cada subdirectorio debajo de ella y el contenido de todos los subdirectorios?

+1

Esto tiene que ser un engaño: http://stackoverflow.com/questions/550922/how-to-delete-all-files-from-current-directory-including-current-directory – jmucchiello

Respuesta

158

Practique la informática segura. Basta con subir un nivel en la jerarquía y no utilice una expresión comodín:

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

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

+6

¿Por qué es esto más seguro? – Yen

+33

Porque está haciendo coincidir específicamente un directorio con nombre y, por lo tanto, es menos probable que elimine algo que no tiene la intención de eliminar. – tvanfosson

+5

Es cierto. Pude verme haciendo eso bastante fácilmente. – Yen

21

Uso

rm -rf * 

Actualización: Los . representa directorio actual, pero no podemos utilizar esto. El comando parece tener controles explícitos para . y ... Usa el comodín comodín en su lugar. Pero esto puede ser riesgoso.

una versión más segura de la OMI es utilizar:

rm -ri * 

(. Se le pedirá confirmación antes de eliminar todos los archivos/directorio)

+11

"Puede ser arriesgado" es maravillosamente lacónico. –

+5

Al hacer este tipo de cosas, he encontrado una rápida ls -r. Primero le permite ver lo que va a eliminar. Útil para dar una idea rápida de que no va a ir para eliminar todo el disco ... –

+2

¿Por qué es más arriesgado que rm -rf ? – Yen

4

hacer Seguro se encuentra en el directorio correcto

 
rm -rf * 
+2

Esto no elimina los archivos o subdirectorios cuyo nombre comienza con un punto. –

+1

cierto. en mi prueba, tampoco lo hace rm -rf. tvanfosson tiene la mejor solución IMO con su "cd ...; rm -rf " – digitaljoel

5

rm -rf *

No lo hagas, es peligroso. ASEGÚRESE DE ESTAR EN EL DIRECTORIO CORRECTO.

41

Eliminará todos los archivos/directorios por debajo de la actual.

find -mindepth 1 -delete 

Si usted quiere hacer lo mismo con otro directorio cuyo nombre tiene, sólo puede nombrar que

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

Si desea eliminar no sólo los subdirectorios y archivos de la misma, sino también el directorio en sí, omita -mindepth 1. Hazlo sin -delete para obtener una lista de las cosas que se eliminarán.

+0

Necesitaba eliminar todos los archivos en subdirectorios, pero no quería eliminar los subdirectorios. encontrar -mindepth 2 -delete funcionó muy bien! –

+0

Necesita '-mindepth 1' si está especificando un directorio (' find -mindepth 1 -delete'). De lo contrario, Johannes tiene razón, no eliminará el directorio de trabajo actual (cuando se usa 'find -delete'). – Weboide

+0

IMO, esta es la mejor respuesta, particularmente en scripts. – wizonesolutions

5

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

Dicho esto, si eres como yo y tienes varias ventanas de terminal abiertas al mismo tiempo, será mejor que estés a salvo y usa rm -ir . Veamos los argumentos del comando para comprender por qué.

Primero, si nos fijamos en el rm command man page (man rm en la mayoría de Unix), observa que –r significa "eliminar el contenido de los directorios recursivamente". Por lo tanto, al hacer solo rm -r . se 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 borra todos los archivos y directorios en el directorio actual y nunca te pide que confirmes que realmente quieres hacer eso. -f es particularmente peligroso si ejecuta el comando en un usuario de privilegios ya que puede eliminar el contenido de cualquier directorio sin tener la oportunidad de asegurarse de que es realmente lo que desea.

En el otherhand, en rm -ri . la -i que sustituye a la -f significa "rápido ante cualquier remoción". Esto significa que tendrás la oportunidad de decir "¡oups! Eso no es lo que quiero" antes de que rm se alegre y borre todos tus archivos.

En mis primeros días sysadmin hice un rm -rf / en un sistema mientras estaba conectado con privilegios completos (raíz). El resultado fue dos días después de restaurar el sistema a partir de copias de seguridad. Es por eso que ahora empleo rm -ri ahora.

2

Esta solución más simple segura & general es probable que:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf 
38

lo que siempre hago es escribir

rm -rf * 

y después haga clic en ESC- *, y bash expandirá el * a una lista explícita de archivos y directorios en el directorio de trabajo actual.

Los beneficios son:

  • que puede revisar la lista de archivos que desea eliminar antes de oprimir la tecla Enter.
  • El historial de comandos no contendrá "rm -rf *" con el comodín intacto, que luego podría reutilizarse accidentalmente en el lugar incorrecto en el momento equivocado. En cambio, el historial de comandos tendrá los nombres de archivo reales allí.
  • También ha sido útil una o dos veces para responder "espere un segundo ... ¿qué archivos acabo de eliminar?". Los nombres de archivo son visibles en el buffer de desplazamiento de terminal o en el historial de comandos.

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

bind TAB:insert-completions 
+17

+1 solo para la expansión ESC- *, eso era nuevo para mí. –

+0

Falta '--' en esta respuesta? Este enfoque es impresionante en general, debo decir. –

4

¿Qué tal:

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

que solo está presumiendo :-) pero de todos modos es genial –

+25

jQuery es tan poderoso. – Pawel

1

I creer que esta respuesta es mejor:

https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

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

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

Cuestiones relacionadas