Percebi um comportamento estranho com o du
comando quando ele é usado com a -L
opção de linha de comando.
Estou usando o Slackware 14 e o Coreutils 8.19.
Para reproduzir o comportamento estranho, crie duas pastas:
mkdir foo
mkdir bar
Crie um arquivo dentro de uma da pasta:
perl -e 'print "A"x10000' > foo/text
E um link simbólico na outra pasta:
ln -s ../foo/text bar/text
Agora, se você digitar:
du -h -L bar
Você terá:
16k bar
Como o link simbólico foi desreferenciado. Mas se você digitar:
du -h -L *
Você terá:
16K foo
4.0K bar
E o link simbólico não será desreferenciado. Estou esquecendo de algo?
symlink
disk-usage
coreutils
Zagorax
fonte
fonte
du
querer jogar inteligente aqui, mas se você executardf -a -L bar foo
a saída está muito errada (contando os 16K na barra deixando foo vazio).Respostas:
Por padrão,
du
só contará cada arquivo uma vez se estiver vinculado a várias vezes. Se você executá-du -L bar
lo, o arquivo será contado porque ele é acessado apenas uma vez. No entanto, se você executar,du -L *
ele só será contado na primeira vez que o vir. Por exemplo:Observe que a troca da ordem dos argumentos altera a pasta que é relatada como 16K.
Você pode forçar
du
a contar o arquivo duas vezes passando o-l
parâmetroEditar:
Os links simbólicos são um tipo especial de arquivo e é necessária uma etapa extra para seguir o link.
du
não seguirá links simbólicos, a menos que a-L
opção esteja ativada.Um link físico, por outro lado, é basicamente um arquivo existente em duas (ou mais) pastas.
du
presumivelmente rastreia quais arquivos ele viu pelo número do inode para evitar contá-los duas vezes.-l
desativa esse comportamento.Portanto, com apenas
-L
, seguirá o link simbólico, mas se o arquivo de destino tiver um número de inode, ele já viu que não será recontado. Com apenas-l
contará links físicos duplicados, mas não seguirá links simbólicos.Se você usar
-l
e-L
juntos, ele seguirá ambos os links simbólicos, e também permitir a contagem do arquivo (s) alvo mais de uma vez.fonte
-l
fazcount sizes many times if hard linked
, mas aqui eu estou trabalhando com ligação simbólica. Além disso, por-l
si só não resolve o problema, enquanto se eu usar os dois-l
e-L
contar o tamanho corretamente.-l
e-L
interagir. A explicação ficou um pouco longa para um comentário, por isso atualizei minha resposta.