Existe alguma situação possível quando
ls -l file.txt
está mostrando não 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 contagens de bytes diferentes do mesmo arquivo?
Respostas:
Sim, existem casos assim.
No caso de links simbólicos no sistema Linux com GNU
ls
, elels -l
exibirá o tamanho do link, enquantowc -c
resolverá o arquivo real e lerá o número de bytes lá. Abaixo, você pode ver quels -l
reporta 29 bytes, enquantowc
reporta 172 bytes no arquivo real.No caso de sistemas de arquivos virtuais , como
/proc
ou/sys
, muitos arquivos serão mostrados com tamanho 0ls -l
. No/dev
sistema de arquivos, temos uma variedade de arquivos especiais, como dispositivos de caracteres e dispositivos de bloco -wc -c
trava neles els -l
mostra números maiores e menores em vez de tamanho.Os pipes nomeados serão relatados como
0
bytes porls -c
, maswc -c
realmente lerão o conteúdo do pipe, portanto, tecnicamente, ele informará quantos dados há no pipe nomeado:Para arquivos regulares, o tamanho deve ser igual.
O ponto de
ls -l
ewc -c
, e como eles funcionam também difere.wc -c
abre realmente o arquivo para leitura (você pode ver isso se executar,strace wc -c /etc/passwd
por exemplo).ls -l
só realizastat()
chamadas naqueles. Isso também explica o motivo pelo qual/proc
ls -l
mostra o tamanho 0 - você não pode declarar esses arquivos porque eles não são "reais" ou realmente armazenados no disco rígido / ssd.wc -c
em vez disso, lê o conteúdo desse arquivo e calcula seu tamanho.Por fim,
ls -l
é apenas uma ferramenta para listar itens interativamente. Raramente é um bom ajuste para scripts. Quando você realmente precisar ler os dados, usewc -c
.Observe que, para criar scripts e avaliar o tamanho de um arquivo,
ls
não é o melhor candidato. De fato, é uma das práticas comuns evitar a análise dels
saída . Por favor, usedu -b
para descobrir o tamanho de um arquivo.fonte
/sys/
,/proc/
etc) podem fornecerstat
informações, se o implementador escolher. Na maioria das vezes, não há um motivo convincente para isso, portanto é omitido. Exemplos incluem o/proc/kcore
que é relatado como o tamanho da memória endereçável do kernel (geralmente muito mais do que a memória física disponível).ls -l
retornará o tamanho do arquivo relatado pelo sistema de arquivos.wc -c
tentará ler o arquivo para determinar o tamanho 'real'. Pelas minhas observações, parece tentar primeiro procurar o final e, se isso não funcionar, ele lerá o arquivo inteiro, contando o tamanho conforme for.Essa é uma descrição simples do que as duas ferramentas fazem, mas leva a várias implicações para os resultados:
ls
dará uma saída incorreta para certos 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á para arquivos sem permissões de leitura, enquantols
requer apenas permissões para listar o diretório (comparels -l /etc/shadow
comwc -c /etc/shadow
).Como mencionado em outras respostas, o comportamento dos links simbólicos também é diferente. Como
wc
tenta lê-los, ele acaba lendo o arquivo para o qual o link simbólico aponta, enquanto, comols
apenas consulta o sistema de arquivos, informa o tamanho usado para armazenar o próprio link simbólico.Tenho certeza de que existem outras diferenças em que ainda não pensei, mas pensei em dar uma explicação clara e simples sobre o motivo básico por trás dessas diferenças.
fonte
seek()
. Parece ser esse o caso, depois de executarstrace wc -l
alguns arquivos grandes.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:
Provavelmente, essa é uma maneira de descobrir se algo é um arquivo especial.
fonte
wc -c
para mim, pelo menos, chamafstat
, mas aparentemente para outros fins. Ele encontra o comprimento do arquivolseek
até o final. Caso isso retorne um erro,read
é o arquivo inteiro.