Pregunta simple, pero no estoy seguro de dónde buscar y google no responde a los puntos y las barras.
Sólo estoy tratando de contar el # de archivos y directorios en el directorio actual (sin incluir subcarpetas / archivos) y estaba tratando de diferenciar ls -1 | wc -l
y ls | wc -l
ya que parecen idénticos. Un sitio que estaba viendo decía "Tenga en cuenta que esto también cuenta los directorios ./ y ../". con respecto al que tiene ls -1
, y no estoy seguro de si eso significa que incluye los directorios antes o algo (que no quiero), pero parece que no lo hizo durante las pruebas.
¿Podría alguien confirmar cuál de esos sería el más adecuado para contar # de archivos y directorios en el directorio actual solamente (no sub) y qué quieren decir con ./ y ../ directorios?
Respuestas:
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 losstat
,pwd
ycd
comandos (en Linux):Observe eso
bin
ysbin
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 towc -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 ejemplols -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. Marquewc -l
para obtener una línea de comando completa de lals -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ámetrols
.fuente
-a
e-A
incluyen también archivos ocultos que me di cuenta de que quiero evitar, así que a lo sumo lo haríals -b | wc -l
, pero esto me da la respuesta correcta. ¿Es incorrecta la línea que copio y pego con respecto a este comando? Si era correcto, ¿no debería obtener una salida de 8 cuando hay 6 archivos o carpetas en un directorio?mkdir()
llamada al sistema. No todos los sistemas de archivos los tienen y ni siquiera son necesarios ni requeridos por POSIX.Para responder la pregunta en el tema:
Cuando se crea un directorio B en Unix, se agrega como una nueva entrada a otro directorio A (su directorio padre), y en B, se agregan dos entradas: una llamada
.
como un enlace rígido a sí mismo y otra llamada..
como un disco duro enlace a A.Esos son los únicos enlaces duros a directorios permitidos (aunque algunas versiones anteriores de algunos Unices también permitían enlaces arbitrarios).
Es por eso que con la mayoría de los sistemas de archivos (
btrfs
siendo una notable excepción), el número delinks
de un directorio es una indicación de cuántos subdirectorios tiene (contabilizando sus..
entradas).Cuando renombra / mueve un directorio, si está en el mismo directorio (con un nombre diferente), solo
A
se cambia la entrada del nombre . B.
y..
no se ve afectado. Pero si se mueve hacer un directorio diferente, entonces..
enB
cambiará. Eso explica por qué puede cambiar el nombre de un directorio en el que no tiene acceso de escritura (suponiendo que tenga acceso de escritura al directorio principal) solo mientras no lo mueva a otro directorio (de lo contrario, la necesidad de cambiar el..
entrada impide usted de moverlo).Sin embargo,
/a/b/../c
tenga cuidado: puede que no sea lo mismo que/a/c
porque/a/b
podría ser un enlace simbólico a otro directorio.Una excepción a eso es cuando esa ruta se le da al
cd
comando a algunos shells. Esoscd
s tratan..
lógicamente ignorando las..
entradas en los directorios. Una razón por la que a menudo se vecd -P
en scripts escritos correctamente, para deshabilitar esa característica que de lo contrario podría causar confusión e inconsistencias.Para contar el número de entradas en el directorio actual excluyendo
.
y..
conbash
, puede hacer:Con zsh:
Portablemente:
fuente
ls | wc -l
es el único que excluye.
y..
ls
no enumera los archivos ocultos. Necesitasls -A
obtener lo mismo que esos. SI no desea contar los archivos ocultos, eliminedotglob
(para bash) oD
(para zsh) o agregue un! -name '.*'
antes-print
parafind
.ls | wc -l
todavía me da la respuesta correcta y excluye los archivos ocultos,.
y..
?.
,..
y otro archivo cuyo nombre comienza con el.
que no está enlistado por ls pero sí porls -A
. Porls | wc -l
lo tanto, no le da la respuesta correcta porque no cuenta ese archivo oculto..
y..
son archivos ocultos ya que comienzan con a.
. Incluso hay una leyenda que explica que los archivos de puntos están ocultos por accidente, ya que una implementación tempranals
solo debía excluir.
y..
, pero hubo un error que hizo que excluyera cualquier archivo que comenzara con.
.ls | wc -l
no funciona si los nombres de archivo contienen caracteres de nueva línea.No soy un gran experto en Linux, pero sé que Linux (solía ser administrador hace 16 años, en Slackware :) buenos viejos tiempos
los directorios ./ y ../ es simple:. es el directorio actual, .. es el directorio anterior (en el árbol de pwd -comando de directorio local-
Si los cuenta, creo que agregan 2 al total de la lista, en realidad no van recursivamente y cuentan el directorio debajo del actual, y también cuentan nuevamente el directorio actual (.) :))
Básicamente, creo que agrega el valor 2 para contar (archivos) en el directorio actual.
Alguien corríjame si me equivoco.
Solo estoy publicando para ayudar y vi que nadie respondió a esta pregunta aquí, podrían estar ocupados. Pero solo experimente y vea si tiene 10 archivos y cuenta hasta 12, entonces eso es todo.
fuente
ls | wc -1
ls | wc -l
incluye.
y..
cuándo obtengo la respuesta correcta, en lugar de la respuesta correcta + 2.