Cada directorio en un sistema Unix (y probablemente también en cualquier otro sistema) contiene al menos dos entradas de directorio. Estos son .
(directorio actual) y ..
(directorio padre). En el caso del directorio raíz, estos apuntan al mismo lugar, pero con cualquier otro directorio, son diferentes. Esto se puede ver por sí mismo utilizando los stat
, pwd
y cd
comandos (en Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Observe eso bin
y sbin
cada uno tiene dos enlaces. Una es la entrada del directorio en el directorio raíz, y la otra es la .
entrada dentro de ese directorio.
Usar ls
con un pipe to wc -l
es un truco simple para contar el número de líneas en la salida de ls. La suposición es que cada archivo o directorio ocupará exactamente una línea en la salida. GNU ls, cuando la salida es no terminal, lo hará automáticamente; otros pueden necesitar la -1
opción de activar el comportamiento explícitamente. wc -l
simplemente cuenta y genera el número de líneas ( -l
) en su entrada.
El problema con ese enfoque es que en Linux y en los sistemas de archivos utilizados tradicionalmente en Linux, los nombres de archivos y directorios (en realidad son uno y el mismo en este sentido) pueden contener caracteres de nueva línea . En presencia de esos, cualquiera de los métodos se desmorona: esas entradas se contarán como dos o más entradas cuando en realidad son una.
Mientras esté utilizando GNU ls, no tenga entradas de directorio con nombres que contengan caracteres de nueva línea y no tenga alias impares para ls
(por ejemplo ls -a
), ambos generarán el recuento de archivos y directorios en el directorio actual (o especificado). Para la mayoría de las personas, esto es lo suficientemente bueno, pero no es válido en el caso general .
Si necesita manejar caracteres inusuales (principalmente nuevas líneas) en los nombres de entrada de directorio correctamente, sugiero usar la -b
opción ls para escapar de ellos. ls -1bA
imprimirá cada nombre de entrada de directorio en su propia línea, escapará de caracteres inusuales (para que cada entrada de directorio se vea como una), incluidos los archivos de puntos y los directorios. Marque wc -l
para obtener una línea de comando completa de la ls -1bA | wc -l
cual informará el número de archivos y directorios en el directorio actual (pero ignore .
y ..
; esa es la diferencia entre -a
y -A
), pero no descenderá a ningún subdirectorio. Si no desea que ningún archivo de puntos se cuente para el total, simplemente omita el -A
parámetro ls
.