¿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 -lmostrará el tamaño del enlace, mientraswc -cque resolverá el archivo real y leerá el número de bytes allí. A continuación puede ver quels -linforma 29 bytes, mientras quewcinforma 172 bytes en el archivo real.En el caso de sistemas de archivos virtuales , como
/proco/sys, muchos archivos aparecerán como de tamaño 0ls -l. Bajo el/devsistema de archivos tenemos una variedad de archivos especiales, como dispositivos de caracteres y dispositivos de bloque: sewc -ccuelga de ellos yls -lmuestra números mayores y menores en lugar de tamaño.Las canalizaciones con nombre se informarán como
0bytesls -c, pero enwc -crealidad 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 -lywc -c, y cómo funcionan también difiere.wc -cen realidad abre un archivo para leer (puedes verlo si corres,strace wc -c /etc/passwdpor ejemplo).ls -lsolo realizastat()llamadas en esos. Esto también explica por qué en los/procls -lshows de tamaño 0: no puede registrar esos archivos porque no son "reales" o están almacenados en el disco duro / ssd.wc -cen su lugar, lee el contenido de ese archivo y calcula su tamaño.Finalmente,
ls -les 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 -cen su lugar.Tenga en cuenta que, para crear secuencias de comandos y evaluar el tamaño de un archivo,
lsno es el mejor candidato. De hecho, es una de las prácticas comunes para evitar el análisis delssalida . Úselodu -bpara averiguar el tamaño de un archivo.fuente
/sys/,/proc/etc.) pueden proporcionarstatinformació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/kcoreque se informa como el tamaño de la memoria del núcleo direccionable (generalmente mucho más que la memoria física disponible).ls -ldevolverá el tamaño del archivo informado por el sistema de archivos.wc -cintentará 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:
lsdará una salida incorrecta para ciertos sistemas de archivos. Por ejemplo, los sistemas de archivos virtualizados como/procinformará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.wcno funcionará en absoluto para archivos sin permisos de lectura, mientraslsque solo requiere permisos para enumerar el directorio (compararls -l /etc/shadowconwc -c /etc/shadow).Como se menciona en otras respuestas, el comportamiento de los enlaces simbólicos también es diferente. Debido a que
wcintenta leerlos, termina leyendo el archivo al que apunta el enlace simbólico, mientras quelssolo 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 -lun 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 -cpara mí al menos llamafstat, pero aparentemente para otros fines. Encuentra la longitud del archivolseekhasta el final. En el caso de que esto devuelva un error,reades todo el archivo.