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

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

La salida del ls -lcomando produce el siguiente resultado:

ingrese la descripción de la imagen aquí

¿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é --helppero 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 -lsalida después del bloque de permiso esel número de enlaces físicos.

Es el mismo valor que devuelve el statcomando 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 lncomando. 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 -lresultado.

Cuando se crea un archivo que no es de directorio por primera vez (con las llamadas al sistema openo creat(o bindo mknodpara 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 lncomando). Y los enlaces se pueden eliminar con la unlink()llamada al sistema (el rmcomando).

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 btrfsse apartan de esa estructura de directorios tradicional. Notará que el número de enlaces en los directorios de btrfslos 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 ., findpodemos saber que no hay ningún subdirectorio. Entonces, todo lo findque 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, findtendrí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 lstattodavía no es necesario).

información relacionada