Traté de eliminar el '.' directorio. Pensé que podría eliminar mi directorio de trabajo sin tener que ir a un directorio principal.
El punto de mi pregunta es buscar una idea de cómo funciona el sistema Linux para eliminar archivos.
fuente
Traté de eliminar el '.' directorio. Pensé que podría eliminar mi directorio de trabajo sin tener que ir a un directorio principal.
El punto de mi pregunta es buscar una idea de cómo funciona el sistema Linux para eliminar archivos.
Eliminar el directorio actual no afecta la integridad del sistema de archivos o su organización lógica. La prevención de la .
eliminación se realiza siguiendo el estándar POSIX que se indica en la rmdir(2)
página del manual:
Si el argumento de ruta se refiere a una ruta cuyo componente final es punto o punto-punto, rmdir () fallará.
Se puede encontrar una justificación en la rm
página del manual:
La utilidad rm tiene prohibido eliminar los nombres punto y punto-punto para evitar las consecuencias de hacer algo como:
rm -r. *
Por otro lado, eliminar explícitamente el directorio actual (es decir, indicando su ruta completa o relativa) es una operación permitida en Unix, al menos desde SVR3, ya que estaba prohibido con Unix versión 7 hasta SVR2. Esto es muy similar a lo que sucede cuando elimina un archivo que se está leyendo o escribiendo activamente. Los procesos que acceden al archivo de eliminación continúan sus operaciones de lectura y escritura como si nada hubiera pasado. Después de haber eliminado un directorio actual del proceso, este directorio ya no es accesible a través de su ruta, pero su inodo permanece presente en el sistema de archivos hasta que el proceso muere o cambia su propio directorio.
Tenga en cuenta que el proceso no podrá utilizar una ruta relativa a su directorio actual para cambiar su cwd (por ejemplo cd ..
) porque ya no hay un..
entrada en su directorio actual.
Cuando alguien escribe rmdir .
, es probable que espere que se elimine la entrada del directorio actual, pero cuando se elimina un directorio (usando su ruta), en realidad se eliminan tres entradas de directorio .
,..
, y el propio directorio.
Eliminar solo .
y no la entrada de directorio de este directorio crearía un directorio no compatible, pero como ya se indicó, está prohibido por el estándar.
Como @Emmanuel señaló correctamente, hay una segunda razón por la cual .
no está permitido eliminar . Hay al menos un sistema operativo compatible con POSIX (Mac OS X con HFS +) que, con fuertes restricciones, admite la creación de enlaces duros a directorios existentes. En tal caso, no hay una forma clara desde dentro del directorio para saber qué enlace rígido es el que se espera eliminar.
..
enlazan a él. Este es el caso único de link count > 2
la gran mayoría de los sistemas operativos y sistemas de archivos, por lo que "algunos sistemas de archivos y / o sistemas operativos" es un eufemismo. Sin embargo, la única excepción no histórica conocida es Mac OS X con HFS + que agrega restricciones sobre quién y qué se puede hacer. Por supuesto, el comentario POSIX se dirige a esta rareza. Ver unix.stackexchange.com/questions/22394/…
rm -r .*
antes y lo voló todo en el directorio padre de forma recursiva ... Eso fue hace más de una década o dos, pero es bueno saber que rm
ya no permite esto.
Se hace así por integridad, ya que actualmente está dentro de ese directorio y .
es solo una referencia propia.
Debe ir en su padre o llamar rmdir
con su ruta, que se puede hacer con:
rmdir `pwd`
Si a menudo necesita eso, puede establecer un alias como:
alias rmc='rmdir `pwd`'
.. que podría llamarse rmc
solo para eliminar el directorio actual.
rmdir .
comando compromiso la integridad del sistema de archivos de una manera que rmdir $(pwd)
o rmdir "$PWD"
no lo hace?
rm *
y qué quiere decir con historial de shell? 2. La respuesta abordó la parte del por qué , 3. ¿Te importa elaborar?
rmdir $(pwd)
, pwd
descubre un nombre lógico para el directorio actual, por ejemplo /foo/bar/baz
, y luego rmdir
, al ver esa ruta, elimina la baz
entrada del /foo/bar
directorio, siempre que se cumplan las condiciones. Esto tiene sentido. El comando rmdir .
, por otro lado, es una instrucción para eliminar la .
entrada del directorio actual, que no está permitida (violaría la restricción de que cada directorio tiene una .
entrada apuntando a sí misma) ni útil (no eliminaría el enlace que querías eliminar)
rm .
yrmdir .
no funcionan, sino por qué se especifica que no funcionan, lo que es independiente de la existencia física de un enlace rígido.rm -rf .*
solo para encontrar esto, incluyendo no solo.
sino también..
, y luego../..
, y luego ...