¿ rm -rf *
Eliminará todos los archivos / carpetas en el directorio actual? Quiero asegurarme de que el comodín *
no se mueva hacia arriba en los directorios superiores y borre todo mi sistema de archivos. :RE
Recuerdo que hace chmod 777 .* -R
a chmod
los archivos ocultos y chmod
ed todo mi sistema de archivos. Obviamente, estaba en la cuenta raíz.
rm -rf ./*
y especificaría explícitamente el directorio actual ... pero Ankur parece decir que no importa de todos modos.Respuestas:
No, si no ajustó mucho su shell, esto no eliminará archivos o directorios que comiencen con a
.
. Para eliminarlos también, puede enumerarlos explícitamenteo usa los patrones de glob correctos (gracias Chris)
EDITAR El punto aquí es que no puede usar
.*
para hacer coincidir archivos como.file
, porque.*
o.*?
también coincidirá con..
o.
..[^.]*
coincide con archivos como.file
, mientras..?*
coincide con archivos como..foo
(*
coincide con cero o más caracteres mientras?
coincide exactamente con uno).fuente
..?*
capturar entradas que comienzan con ".." (por ejemplo..foo
).rm
. por lo tanto, eliminar el contenido de un directorio con * no es la forma más inteligente, en mi humilde opinión.xargs
está un poco más allá del alcance de esta pregunta. Uno podría, por ejemplo, comenzar a pensar en eso cuando el shell se queja de las longitudes de la lista de argumentos.Si desea eliminar un directorio y todo su contenido, puede
chdir
ingresar al directorio principal y arm -rf
ese directorio por nombre, omitiendo toda la pregunta global. Si desea eliminar el contenido pero mantener el directorio, es más fácil eliminar todo y luego volver a crear el directorio.Es complejo crear un globo que coincida con todas las entradas de directorio posibles. y ..; es fácil encontrar una respuesta simple (por ejemplo,
* .??*
) que funcionará casi siempre en la práctica. Esto está bien para uso interactivo, ya que es fácil de recordar y las veces que no funciona pueden detectarse con un post-rmls -a
. Para un script, es más fácil eliminar todo y volver a crear el directorio vacío.fuente
Como creo que esta pregunta es más sobre qué * hace (y no rm), intentemos con otro enfoque.
Si no está seguro de lo que hace el *, puede "probar" primero usando un comando inofensivo como echo. Antes de ejecutar esto, intente adivinar qué mostrarán si los ejecuta en el directorio de inicio.
Pero primero creemos un patio de juegos para que podamos jugar con las estrellas y ver con qué terminamos.
Ahora en este directorio tenemos esto:
Ahora observe en qué se expande el * usando el comando echo:
Entonces, veamos qué sucede con el comando rm
Como puede ver, solo eliminó el archivo2, ya que * solo se expandió a archivo2. Si escribes rm -rf. * Eso sería lo mismo que escribir
Y para ser sincero, eso no parece divertido;)
Espero que esto aclare la parte * de su pregunta.
Actualización: Sin embargo, como señala Ankur Goel, hay algún tipo de protección integrada en rm (algo inusual para los comandos de shell :)
Creemos un nuevo patio de recreo:
Así que ahora tenemos esto de nuevo, pero con test1 propiedad de root como protección si rm comienza a enloquecer.
Entonces, eliminemos todo:
Y parece que rm no se eliminó. y .. incluso si le dijéramos que lo hiciera !!!
Entonces, después de esta larga respuesta, resulta seguro eliminar todo en un directorio con esto:
Pero usaría esto con cuidado, ya que no estoy seguro de que todas las implementaciones de rm se comporten así.
fuente
Sí. rm -rf solo eliminará archivos y carpetas en el directorio actual, y no ascenderá por el árbol de archivos. rm tampoco seguirá los enlaces simbólicos y eliminará los archivos a los que apuntan, por lo que no puede podar accidentalmente otras partes de su sistema de archivos.
fuente
Si no desea subir un nivel como dijo mpez0 y
rm -rf
esta carpeta específica, hay una manera de trabajar en todos los directorios / archivos excepto.
y..
en la carpeta actual haciendo:Por supuesto, si alguno de los directorios / archivos contiene uno de los caracteres en la
IFS
variable especial de shell (por ejemplo, espacio, tabulación, nueva línea), es posible que desee cambiar el IFS primero, ejecutar el comando y luego restaurar el IFS.fuente
Una forma mucho más fácil de vaciar una carpeta completa, evitando también los problemas de "demasiados argumentos" discutidos en esta respuesta , es simplemente eliminar y volver a crear el directorio en sí. Para asegurarse de que esto funciona correctamente cuando está en un directorio con enlaces simbólicos, use las siguientes líneas:
(Si usa en
yourdir
lugar de$(readlink -f yourdir)
solo reemplazaría el enlace mientras la ubicación original permanezca llena)fuente
xargs
...