Comportamento do comando `du` com o sinalizador` -L`

11

Percebi um comportamento estranho com o ducomando quando ele é usado com a -Lopçã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?

Zagorax
fonte
parece duquerer jogar inteligente aqui, mas se você executar df -a -L bar fooa saída está muito errada (contando os 16K na barra deixando foo vazio).
guido

Respostas:

18

Por padrão, dusó contará cada arquivo uma vez se estiver vinculado a várias vezes. Se você executá- du -L barlo, 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:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

Observe que a troca da ordem dos argumentos altera a pasta que é relatada como 16K.

Você pode forçar dua contar o arquivo duas vezes passando o -lparâmetro

Editar:

Os links simbólicos são um tipo especial de arquivo e é necessária uma etapa extra para seguir o link. dunão seguirá links simbólicos, a menos que a -Lopção esteja ativada.

Um link físico, por outro lado, é basicamente um arquivo existente em duas (ou mais) pastas. dupresumivelmente rastreia quais arquivos ele viu pelo número do inode para evitar contá-los duas vezes. -ldesativa 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 -lcontará links físicos duplicados, mas não seguirá links simbólicos.

Se você usar -le -Ljuntos, ele seguirá ambos os links simbólicos, e também permitir a contagem do arquivo (s) alvo mais de uma vez.

David Baggerman
fonte
Obrigado. Isso funciona. No entanto, eu adoraria ter uma explicação extra. Na página homem, eu li que -lfaz count sizes many times if hard linked, mas aqui eu estou trabalhando com ligação simbólica. Além disso, por -lsi só não resolve o problema, enquanto se eu usar os dois -le -Lcontar o tamanho corretamente.
Zagorax
@ Zagorax Sim, a página de manual não é clara sobre como -le -Linteragir. A explicação ficou um pouco longa para um comentário, por isso atualizei minha resposta.
David Baggerman