¿Hay alguna situación posible cuando
ls -l file.txt
no muestra el mismo número de bytes que
wc -c file.txt
En un script encontré la comparación de esos dos valores. ¿Cuál podría ser la razón de eso? ¿Es posible tener conteos de bytes diferentes del mismo archivo?
Respuestas:
Sí, hay tales casos.
En el caso de los enlaces simbólicos en el sistema Linux con GNU
ls
, sels -l
mostrará el tamaño del enlace, mientraswc -c
que resolverá el archivo real y leerá el número de bytes allí. A continuación puede ver quels -l
informa 29 bytes, mientras quewc
informa 172 bytes en el archivo real.En el caso de sistemas de archivos virtuales , como
/proc
o/sys
, muchos archivos aparecerán como de tamaño 0ls -l
. Bajo el/dev
sistema de archivos tenemos una variedad de archivos especiales, como dispositivos de caracteres y dispositivos de bloque: sewc -c
cuelga de ellos yls -l
muestra números mayores y menores en lugar de tamaño.Las canalizaciones con nombre se informarán como
0
bytesls -c
, pero enwc -c
realidad leerán el contenido de la canalización, por lo que técnicamente le dirá cuántos datos hay en la canalización con nombre:Para archivos normales, el tamaño debe ser igual.
El punto de
ls -l
ywc -c
, y cómo funcionan también difiere.wc -c
en realidad abre un archivo para leer (puedes verlo si corres,strace wc -c /etc/passwd
por ejemplo).ls -l
solo realizastat()
llamadas en esos. Esto también explica por qué en los/proc
ls -l
shows de tamaño 0: no puede registrar esos archivos porque no son "reales" o están almacenados en el disco duro / ssd.wc -c
en su lugar, lee el contenido de ese archivo y calcula su tamaño.Finalmente,
ls -l
es solo una herramienta para enumerar elementos de forma interactiva. Rara vez es una buena opción para las secuencias de comandos. Cuando realmente necesite leer los datos, usewc -c
en su lugar.Tenga en cuenta que, para crear secuencias de comandos y evaluar el tamaño de un archivo,
ls
no es el mejor candidato. De hecho, es una de las prácticas comunes para evitar el análisis dels
salida . Úselodu -b
para averiguar el tamaño de un archivo.fuente
/sys/
,/proc/
etc.) pueden proporcionarstat
información, si el implementador lo elige. La mayoría de las veces, no hay una razón convincente para hacerlo, por lo que se omite. Los ejemplos incluyen el/proc/kcore
que se informa como el tamaño de la memoria del núcleo direccionable (generalmente mucho más que la memoria física disponible).ls -l
devolverá el tamaño del archivo informado por el sistema de archivos.wc -c
intentará leer el archivo para determinar el tamaño 'real'. Según mis observaciones, parece que primero intenta buscar hasta el final, y si esto no funciona, leerá todo el archivo, contando el tamaño a medida que avanza.Esta es una descripción simple de lo que hacen las dos herramientas, pero conlleva una serie de implicaciones para los resultados:
ls
dará una salida incorrecta para ciertos sistemas de archivos. Por ejemplo, los sistemas de archivos virtualizados como/proc
informarán un tamaño de cero para muchos archivos, porque estos "archivos" no se almacenan físicamente en ningún lugar; se generan según lo requiera el software.wc
no funcionará en absoluto para archivos sin permisos de lectura, mientrasls
que solo requiere permisos para enumerar el directorio (compararls -l /etc/shadow
conwc -c /etc/shadow
).Como se menciona en otras respuestas, el comportamiento de los enlaces simbólicos también es diferente. Debido a que
wc
intenta leerlos, termina leyendo el archivo al que apunta el enlace simbólico, mientras quels
solo consulta el sistema de archivos, informará el tamaño utilizado para almacenar el enlace simbólico.Estoy seguro de que hay otras diferencias que aún no he pensado, pero pensé que daría una explicación clara y simple sobre la razón básica detrás de estas diferencias.
fuente
seek()
. Este parece ser el caso, después de ejecutarstrace wc -l
un par de archivos grandes.Para un archivo normal, ls y wc llaman stat. Sin embargo, para un archivo de / proc o / sys, ls devuelve 0, pero wc devuelve un número diferente:
Esta es probablemente una forma de descubrir si algo es un archivo especial.
fuente
wc -c
para mí al menos llamafstat
, pero aparentemente para otros fines. Encuentra la longitud del archivolseek
hasta el final. En el caso de que esto devuelva un error,read
es todo el archivo.