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

9

Eu notei um comportamento estranho com o comando du quando ele é usado com a opção de linha de comando -L .

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 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ê receberá:

16k bar

Desde que o symlink foi desreferenciado. Mas se você digitar:

du -h -L *

Você receberá:

16K     foo
4.0K    bar

E o link simbólico não será desreferenciado. Estou faltando alguma coisa?

    
por Zagorax 10.07.2013 / 11:34

1 resposta

13

Por padrão, du contará cada arquivo apenas uma vez se estiver vinculado a várias vezes. Se você executar du -L bar , ele contará o arquivo porque ele só o atinge uma vez. No entanto, se você executar du -L * , ele será contado somente na primeira vez que for visualizado. Por exemplo:

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

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

Observe que trocar a ordem dos argumentos altera qual pasta é relatada como 16K.

Você pode forçar o du a contar o arquivo duas vezes passando o parâmetro -l .

Editar:

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

Por outro lado, um link físico é basicamente um arquivo existente em duas (ou mais) pastas. du presumivelmente rastreia quais arquivos ele viu pelo número de inode para evitar contá-los duas vezes. -l desativa esse comportamento.

Portanto, com apenas -L , ele seguirá o link simbólico, mas se o arquivo de destino tiver um número de inode que já tenha visto, ele não será contado novamente. Com apenas -l , ele contará links físicos duplicados, mas não seguirá links simbólicos.

Se você usar -l e -L juntos, ambos seguirão os links simbólicos e também permitirão a contagem do (s) arquivo (s) de destino mais de uma vez.

    
por 10.07.2013 / 12:55