Si estoy leyendo un archivo almacenado en un sistema de archivos NTFS, y trato de mover/cambiar el nombre de ese archivo mientras todavía se está leyendo, no puedo hacerlo. Si pruebo esto en un sistema de archivos UNIX como EXT3, tiene éxito, y el proceso que realiza la lectura no se ve afectado. Incluso puedo confirmar el archivo y los procesos de lectura no se ven afectados. ¿Como funciona esto? ¿Podría alguien explicarme por qué este comportamiento es compatible con los sistemas de archivos UNIX pero no con NTFS? Tengo una vaga sensación de que tiene que ver con enlaces duros e inodos, pero agradecería una buena explicación.¿Cómo funcionan los comandos de UNIX mv y rm con archivos abiertos?
Respuesta
sistemas de archivos Unix utilizan el recuento de referencias y una arquitectura de dos capas para la búsqueda de archivos.
El nombre de archivo hace referencia a algo llamado inode, para nodo de información o nodo de índice. El inodo almacena (un puntero) el contenido del archivo así como algunos metadatos, como el tipo de archivo (ordinario, directorio, dispositivo, etc.) y quién lo posee.
Los nombres de varios archivos pueden referirse al mismo inodo; luego se llaman hard links. Además, un file descriptor (fd) se refiere a un inodo. Un fd es el tipo de objeto que obtiene un proceso cuando abre un archivo.
Un archivo en un sistema de archivos Unix solo desaparece cuando la última referencia se ha ido, por lo que cuando no hay más nombres (enlaces duros) o fd's haciendo referencia a él. Por lo tanto, rm
en realidad no elimina un archivo; elimina una referencia a un archivo.
Esta configuración del sistema de archivos puede parecer confusa y a veces plantea problemas (especialmente con NFS), pero tiene el beneficio de que el bloqueo no es necesario para muchas aplicaciones. Muchos programas Unix también usan la situación en su beneficio abriendo un archivo temporal y eliminándolo inmediatamente después. Tan pronto como terminan, incluso si se bloquean, el archivo temporal se ha ido.
En Unix, un nombre de archivo es simplemente un enlace al archivo real (inode). Abrir un archivo también crea un enlace (temporal) al archivo real. Cuando todos los enlaces a un archivo han desaparecido (rm y close()), entonces el archivo se elimina.
En NTFS, lógicamente el nombre de archivo es el archivo. No hay una capa indirecta desde el nombre del archivo al archivo metainfo, son el mismo objeto. Si lo abre, está en uso y no se puede eliminar, al igual que el archivo real (inode) en Unix no se puede eliminar mientras está en uso.
Unix: Nombre del archivo -> FileInfo -> Archivo de Datos
NTFS: Nombre de archivo/FileInfo -> Archivo de Datos
- 1. ¿Entiendo cómo funcionan los descriptores de archivos Unix en C?
- 2. Caso de uso práctico de 'git rm' y 'git mv' con git?
- 3. Demasiados archivos abiertos con multiprocesamiento.Pool
- 4. Listar todos los archivos abiertos
- 5. ¿Cómo funcionan los descriptores de archivos?
- 6. ¿Cómo funcionan los archivos de encabezado y fuente en C?
- 7. Unix y camiseta - cadena de comandos
- 8. Ejecute una secuencia de comandos sobre varios archivos en Unix
- 9. ¿Cómo agregar y confirmar las eliminaciones realizadas con "rm" en lugar de "git rm"?
- 10. Mercurial hg mv no mueve todos los archivos
- 11. C# archivos abiertos con la aplicación por defecto y parámetros
- 12. Cierre todos los archivos abiertos en ipython
- 13. IOException: Demasiados archivos abiertos
- 14. Cygwin: diferencia entre el comando '\ rm -fr' y 'rm -fr'?
- 15. Demasiados manejadores de archivos abiertos
- 16. ¿Carpeta Cant RM con GIT rm?
- 17. Eliminación de archivos utilizando el comando rm
- 18. ¿Cómo se envía la salida de ls a mv?
- 19. Unix historia de comandos sustitución^foo^bar (para múltiples sustituciones)
- 20. java.net.SocketException: Demasiados archivos abiertos
- 21. ¿Cómo buscar todos los archivos abiertos en Eclipse?
- 22. Unix: Cómo borrar archivos que aparecen en un archivo
- 23. Los archivos JPEG no funcionan como recursos dibujables: los archivos png funcionan bien
- 24. Ayuda con los descriptores de archivos en Unix
- 25. Linux/UNIX instalar archivos de datos
- 26. Demasiados errores archivos abiertos pero lsof muestra un número legal de archivos abiertos
- 27. rsync equivalente comando mv
- 28. Cerrar archivos abiertos usando C#
- 29. Git + Rails: ¿Cómo restaurar los archivos eliminados con "git rm -r"?
- 30. ¿Cómo busco los búferes abiertos en Vim?
¿Existen limitaciones en cuanto a dónde puedo mover un archivo abierto? P.ej. solo dentro del mismo sistema de archivos? –
@ivan_pozdeev haciendo un 'mv' en un archivo a través de diferentes sistemas de archivos, en realidad copia los datos y borra el archivo original, en este caso es similar a una' rm' del archivo abierto. – dsonck92