Contagem de bytes de “ls -l arquivo aleatório” versus “wc -c arquivo aleatório”

23

Existe alguma situação possível quando

ls -l file.txt

não mostra o mesmo número de bytes que

wc -c file.txt

Em um script, encontrei a comparação desses dois valores. Qual poderia ser a razão disso? É possível ter diferentes contagens de bytes do mesmo arquivo?

    
por Rokas.ma 16.01.2017 / 15:35

3 respostas

13

Sim, existem esses casos.

No caso de links simbólicos no sistema Linux com GNU ls , o ls -l exibirá o tamanho do link, enquanto wc -c resolverá o arquivo real e lerá o número de bytes lá. Abaixo, você pode ver que ls -l informa 29 bytes, enquanto wc informa 172 bytes no arquivo real.

$ ls -l /etc/resolv.conf                                                                                                 
lrwxrwxrwx 1 root root 29 1月  17  2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf                                                                                                 
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf                                                                                  
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf                                                                                  
-rw-r--r-- 1 root root 172 1月  15 15:49 /var/run/resolvconf/resolv.conf

No caso de sistemas de arquivos virtuais , como /proc ou /sys , muitos arquivos serão mostrados como tendo tamanho 0 ls -l . Sob o sistema de arquivos /dev , temos vários arquivos especiais, como dispositivos de caracteres e dispositivos de bloco - wc -c trava e ls -l mostra

Os pipes nomeados serão informados como 0 bytes por ls -c , mas wc -c lerá o conteúdo do canal, então, tecnicamente, ele informará quantos dados estão no canal. pipe nomeado:

$ mkfifo named.pipe                                                                                                      
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月  16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done                 echo "This is a test" >named.pipe 

Para arquivos regulares, o tamanho deve ser igual.

O ponto de ls -l e wc -c e como eles funcionam também difere. wc -c na verdade abre o arquivo para leitura (você pode ver isso se você executar strace wc -c /etc/passwd por exemplo). ls -l realiza apenas stat() sobre esses. Isso também explica porque em /proc ls -l mostra tamanho 0 - você não pode registrar esses arquivos porque eles não são "reais" ou realmente armazenados no disco rígido / ssd. wc -c , lê os conteúdos desse arquivo e calcula seu tamanho.

Por fim, ls -l é apenas uma ferramenta para listar itens de forma interativa. Raramente é um bom ajuste para scripts. Quando você realmente precisa ler os dados, use wc -c .

Por favor, note que para o script e avaliar o tamanho de um arquivo, ls não é o melhor candidato. Na verdade, é uma das práticas comuns para evitar a análise de ls output . Por favor, use du -b para descobrir o tamanho de um arquivo.

    
por 16.01.2017 / 16:11
11

ls -l retornará o tamanho do arquivo informado pelo sistema de arquivos.

wc -c tentará ler o arquivo para determinar o tamanho 'real'. A partir das minhas observações, parece tentar primeiro procurar até o fim, e se isso não funcionar, ele lerá todo o arquivo, contando o tamanho como vai.

Esta é uma descrição simples do que as duas ferramentas fazem, mas leva a várias implicações para os resultados:

ls fornecerá uma saída incorreta para determinados sistemas de arquivos. Por exemplo, sistemas de arquivos virtualizados como /proc reportarão um tamanho zero para muitos arquivos, porque esses "arquivos" não são fisicamente armazenados em nenhum lugar; eles são gerados conforme exigido pelo software.

wc não funcionará em todos os arquivos sem permissões de leitura, enquanto ls requer apenas permissões para listar o diretório (compare ls -l /etc/shadow to wc -c /etc/shadow ).

Como mencionado em outras respostas, o comportamento de links simbólicos também é diferente. Como wc tenta lê-los, ele acaba lendo o arquivo para o qual o link simbólico aponta, ao passo que ls apenas consulta o sistema de arquivos, ele informará o tamanho usado para armazenar o próprio link simbólico.

Tenho certeza de que há outras diferenças que ainda não pensei, mas pensei em dar uma explicação clara e simples sobre a razão básica por trás dessas diferenças.

    
por 16.01.2017 / 16:49
6

Para um arquivo normal, ls e wc chamam stat. No entanto, para um arquivo de / proc ou / sys, ls retorna 0, mas wc retorna um número diferente:

$ ls -l /proc/modules
-r--r--r--  1 root root 0 Jan 16 14:56 modules
                        ^ this one
$ wc -c /proc/modules
7621 modules

Esta é provavelmente uma forma de descobrir se algo é um arquivo especial.

    
por 16.01.2017 / 15:58

Tags