
La salida del ls -l
comando produce el siguiente resultado:
¿Cuál es el campo numérico entre el permiso del archivo y el propietario? es decir, ¿cuáles son esos?1, 1, 1 y 2? Revisé --help
pero eso no lo explica.
[EDITAR] Pensé que era la cantidad de archivos en un directorio, pero no lo es. Ver imagen. "tempFolder" tiene 3 archivos pero aún muestra un "2"
Respuesta1
Nota: editado después del comentario de @StephaneChazela
El primer número de la ls -l
salida después del bloque de permiso esel número de enlaces físicos.
Es el mismo valor que devuelve el stat
comando en "Enlaces".
Este número es el recuento de enlaces físicos del archivo, cuando se hace referencia a un archivo, o el número de entradas de directorio contenidas, cuando se hace referencia a un directorio.
Aarchivonormalmente tiene un recuento de enlaces físicos de 1, pero esto cambia si los enlaces físicos se crean con el ln
comando. Verel manual de referencia de Debian.
En su ejemplo, agregar un enlace físico para tempFile2 aumentará su número de enlaces:
ln -l
ln tempFile2 tempHardLink
ln -l
Ambosarchivotemp2ytempHardLinktendrá un recuento de enlaces de 2.
Si haces el mismo ejercicio con un enlace simbólico ( ln -s tempFile2 tempSymLink
), el valor del conteo no aumentará.
Adirectoriotendrá un recuento mínimo de 2 para '.'
(enlace a sí mismo) y para la entrada en el directorio principal.
En su ejemplo, si desea aumentar el número de enlaces decarpeta temporal, crea un nuevo directorio y el número aumentará.
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
El enlace deotra carpeta/acarpeta temporal/(que es ..
) se agregará al recuento.
Respuesta2
En Unix, normalmente, un archivo es una entrada en una tabla de archivos. Hay diferentes tipos de archivos: archivos normales, dispositivos, enlaces simbólicos, puertas, tuberías, enchufes, directorios...
El número de inodo (que puede ver en el resultado de ls -i
) es el índice en esa tabla.
Ahora, no se accede a los archivos medianteinodopero porcamino. Acaminoes una cadena dedirectorioentradas. Notarás que no estamos hablando decarpetapero dedirectorioaquí. Porque eso es lo que es un directorio (piense en un directorio telefónico).
Un directorio es un tipo especial de archivo que da nombres a varios inodos. Una entrada de directorio es una asignación de un nombre a un inodo.
Un archivo determinado (un inodo) puede tener más de un nombre en un directorio (al igual que puede haber más de un nombre en un número de teléfono) y también puede tener nombres (entradas) en más de un directorio. esos se llamanEnlaces, también conocido comoenlaces durosdistinguir deenlaces suaves(un término de jerga paraenlace simbólico,que es un tipo especial de archivo que es un puntero a una ruta).
Un archivo (inodo) realiza un seguimiento del número de enlaces (de entradas en cualquier directorio) que tiene, de modo que cuando el número llega a 0 (cuando se desvincula del último directorio al que se hizo referencia), se desasigna.
Ese es ese número (el número de enlaces) que se muestra en el ls -l
resultado.
Cuando se crea un archivo que no es de directorio por primera vez (con las llamadas al sistema open
o creat
(o bind
o mknod
para algunos tipos de archivos), se hace proporcionando una ruta al nuevo archivo (como "/a/b"
). Lo que sucede entonces es que se asigna un nuevo archivo y un inodo y se agrega una nueva entrada al directorio asociado con el "a"
nombre en el "/"
directorio raíz. esa es la inicialenlaceentonces el recuento de enlaces es uno.
Se pueden agregar más enlaces más adelante con la link()
llamada al sistema (el ln
comando). Y los enlaces se pueden eliminar con la unlink()
llamada al sistema (el rm
comando).
Notarás que los archivos de tipodirectoriogeneralmente tienen un número de enlaces mayor o igual a 2.
Ahora, cuando creas un directorio, estás realizando la mkdir()
llamada del sistema. Algo como mkdir("/a/b")
. Lo que hace entonces es asignar un nuevo archivo de tipo directorio. En ese nuevo directorio, crea automáticamente dos entradas:
"."
(puntoparadirectorio). Que es un vínculo consigo mismo. Entonces el recuento de enlaces ahora es 1.".."
(paradirectorio'sdirectorio). Que es un enlace a"/a"
. Entonces el recuento de enlaces"/a"
se incrementa en uno.
Luego, ese nuevo directorio está vinculado "/a"
(se agrega una entrada "/a"
para él), por lo que su recuento de enlaces ahora es 2. Si "/a/b/c"
se crea un directorio, debido a la ".."
entrada en "/a/b/c"
, el recuento de enlaces "/a/b"
pasará a ser 3.
La mayoría de Unices restringen la creación de enlaces adicionales a un directorio porque pueden causar bucles problemáticos. Cuando permiten link()
un directorio, generalmente solo el superusuario puede hacerlo.
Algunos sistemas de archivos como btrfs
se apartan de esa estructura de directorios tradicional. Notará que el número de enlaces en los directorios de btrfs
los sistemas de archivos es siempre uno, aunque esos directorios contengan una "."
entrada con el mismo número de inodo que ellos mismos.
El hecho de que el recuento de enlaces sea tradicionalmente 2 más el número de subdirectorios tiene su utilidad. Por ejemplo, en:
find . -name '*.c' -print
Si .
no contiene subdirectorios pero contiene millones de archivos. Al verificar el recuento de enlaces .
, find
podemos saber que no hay ningún subdirectorio. Entonces, todo lo find
que tiene que hacer es leer el contenido del directorio e informar las entradas que terminan en .c
(como un grep '\.c$'
archivo de unos pocos megabytes, no es gran cosa). De lo contrario, find
tendría que verificar el tipo de cada archivo para ver si hay directorios a los que descender allí (lo que resultaría en tantas lstat()
llamadas al sistema). Por supuesto, este tipo de optimización no funciona btrfs
(aunque en las versiones modernas de Linux, el tipo de archivos también se almacena en la entrada del directorio para algunos sistemas de archivos (incluido btrfs
) y lo devuelve la getdents(2)
llamada al sistema utilizada para recuperar la lista de entradas. en un directorio, por lo que lstat
todavía no es necesario).