¿Cuál es el número entre el permiso del archivo y el propietario en la salida del comando ls -l?

35

La salida del ls -lcomando produce el siguiente resultado:

ingrese la descripción de la imagen aquí

¿Cuál es el campo de número entre el permiso de archivo y el propietario? es decir, ¿cuáles son esos 1, 1, 1 y 2 ? Revisé el --helppero eso no lo explica.

[EDITAR] Pensé que era el número de archivos en un directorio, pero no lo es. Ver imagen "tempFolder" tiene 3 archivos pero aún muestra un "2"

KMC
fuente

Respuestas:

33

Nota: editado después del comentario de @StephaneChazelas

El primer número de la ls -lsalida después del bloque de permisos es el número de enlaces duros .

Es el mismo valor que el que devuelve el statcomando en "Enlaces".

Este número es el recuento del enlace fijo del archivo, cuando se refiere a un archivo, o el número de entradas de directorio contenidas, cuando se refiere a un directorio.

Un archivo generalmente tiene un recuento de enlaces duros de 1, pero esto cambia si se hacen enlaces duros con el lncomando. Consulte el manual de referencia de Debian .

En su ejemplo, agregar un enlace duro para tempFile2 aumentará su conteo de enlaces:

ln -l
ln tempFile2 tempHardLink
ln -l

Tanto tempFile2 como tempHardLink tendrán un recuento de enlaces de 2.

Si hace el mismo ejercicio con un enlace simbólico ( ln -s tempFile2 tempSymLink), el valor de conteo no aumentará.

Un directorio tendrá un recuento mínimo de 2 para '.'(enlace a sí mismo) y para la entrada en el directorio de su padre.

En su ejemplo, si desea aumentar el recuento de enlaces de tempFolder , cree un nuevo directorio y el número aumentará.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

El enlace de otroFolder / a tempFolder / (que es ..) se agregará al recuento.

Damien
fuente
Dado que se muestra entre los permisos y la propiedad, da la impresión de que es muy importante, pero nunca lo usé. ¿Cuándo es típicamente necesario?
Emanuel Berg
1
Eso es incorrecto Es el recuento de enlaces, punto. Para los directorios, tiene 2 para su entrada en su directorio padre (como cualquier archivo) y la .entrada en sí misma, más uno para las ..entradas en cada uno de sus subdirectorios.
Stéphane Chazelas
@StephaneChazelas Toda la documentación que he encontrado habla del recuento de enlaces duros (por ejemplo, linuxgazette.net/issue35/tag/links.html ). También descubrí que se hizo una pregunta similar en AskUbuntu ( askubuntu.com/questions/19510/… ). Comprobaré el código fuente de coreutils y veré si puedo encontrar la respuesta exacta.
Damien
2
@EmanuelBerg cuando los sistemas de archivos eran mucho menos confiables de lo que son ahora y estabas trabajando en el sistema de archivos que desarrollaste, y lspodías gastar 2 caracteres y darte más información, y no había stat(1)comando ni find(1)ni fsck, ni enlaces simbólicos, probablemente era mucho más útil de lo que es hoy. No se puede cambiar sin romper los guiones de shell cuyos escritores han pasado mucho tiempo /dev/null; Ha sido así desde al menos 1979.
msw
8

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 la salida de ls -i) es el índice en esa tabla.

Ahora, no accede a los archivos por inodo sino por ruta . Una ruta es una cadena de entradas de directorio . Notarás que no estamos hablando de carpeta sino de directorio aquí. Porque es lo que es un directorio (piense en un directorio telefónico).

Un directorio es un tipo especial de archivo que da nombres a una serie de inodos. Una entrada de directorio es una asignación de un nombre a un inodo.

Un archivo dado (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 llaman enlaces también conocidos como enlaces duros para distinguirlos con enlaces blandos (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 el número (el número de enlaces) que se muestra en la ls -lsalida.

Cuando se crea un archivo que no directorio de la primera vez (con la openo creat(o bind, o mknodpara algunos tipos de archivos) llamadas al sistema), se realiza proporcionando una ruta de acceso al archivo nuevo (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. Ese es el enlace inicial, por lo que el recuento de enlaces es uno.

Se pueden agregar más enlaces más adelante con la link()llamada al sistema (el lncomando). Y los enlaces se pueden eliminar con la unlink()llamada al sistema (el rmcomando).

Notarás que los archivos de tipo directorio generalmente tienen una cantidad de enlaces mayor o igual a 2.

Ahora, cuando crea un directorio, está llamando a la llamada del mkdir()sistema. Algo así 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:

  • "."( punto para el directorio ). Que es un enlace a sí mismo. Entonces el recuento de enlaces ahora es 1.
  • ".."(para el directorio del directorio ). Que es un enlace a "/a". Por lo tanto, el recuento de enlaces "/a"se incrementa en uno

Luego, se vincula ese nuevo directorio "/a"(se agrega una entrada "/a"), por lo que su recuento de enlaces ahora es 2. Si "/a/b/c"se crea un directorio, debido a la ".."entrada "/a/b/c", el recuento de enlaces "/a/b"será 3.

La mayoría de los Unices restringen la creación de más enlaces a un directorio porque pueden causar bucles problemáticos. Cuando permiten un link()en un directorio, generalmente solo el superusuario puede hacerlo.

Algunos sistemas de archivos como btrfspartir de esa estructura de directorio tradicional. Notará que los recuentos de enlaces en los directorios en btrfslos sistemas de archivos son siempre uno, aunque esos directorios contienen 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 subdirecciones tiene su uso. Por ejemplo, en:

find . -name '*.c' -print

Si .no contiene subdires pero contiene millones de archivos. Al verificar el recuento de enlaces de ., findpuede saber que no hay subdirección. Entonces, todo lo que findtiene que hacer es leer el contenido del directorio e informar las entradas que terminan en .c(como grep '\.c$'en un archivo de pocos megabytes, no es gran cosa). De findlo contrario, tendría que verificar el tipo de cada archivo para ver si hay directorios para descender allí (lo que da como resultado 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 (incluidos btrfs) y se devuelve mediante la getdents(2)llamada al sistema utilizada para recuperar la lista de entradas en un directorio, entonceslstat todavía no es necesario).

Stéphane Chazelas
fuente
+1, gran respuesta :) Al mirar el código fuente ls, noté que el número de enlace se actualizó después de una llamada a stat. Entonces el comando stat le dará el valor de los enlaces para un archivo o directorio.
Damien
¿Qué significa tener en -lugar de cualquier número en el lugar después de los permisos de ls -lsalida?
Shubham