du ignorar links simbólicos

6

O comportamento padrão de du no meu sistema não é o comportamento padrão adequado.

Se eu ls my /data folder, eu vejo (removendo o material que não é importante):

ghs
ghsb -> ghs
hope
rssf -> roper
roper

Dentro de cada pasta há um conjunto de pastas com números como nomes. Desejo obter o tamanho total de todas as pastas denominadas 14 , portanto, uso:

du -s /data/*/14

E eu vejo ...

161176 /data/ghs/14
161176 /data/ghsb/14
8 /data/hope/14
681564 /data/rssf/14
681564 /data/roper/14

O que eu quero é apenas:

161176 /data/ghs/14
8 /data/hope/14
681564 /data/roper/14

Eu não quero ver os links simbólicos. Eu tentei -L , -D , -S , etc. Eu sempre recebo os links simbólicos. Existe uma maneira de removê-los?

    
por kainaw 23.09.2014 / 21:19

2 respostas

11

Isso não é du resolver os links simbólicos; é a sua concha.

* é um shell glob; Ele é expandido pelo shell antes de executar qualquer comando. Assim, de fato, o comando que você está executando é:

du -s /data/ghs/14 /data/ghsb/14 /data/hope/14 /data/rssf/14 /data/roper/14

Se o seu shell é bash, você não tem como dizer para não expandir links simbólicos. No entanto, você pode usar find (versão GNU):

find /data -mindepth 2 -maxdepth 2 -type d -name 14 -exec du -s {} +
    
por 23.09.2014 / 21:30
0

Faça du pular links simbólicos:

du não é inteligente o suficiente para não perseguir links. Por padrão, find irá ignorar links simbólicos. Então, criando uma aliança profana entre find , du , awk e cat , o encantamento de magia negra apropriada se torna:

find /home/somedirectory/ -exec du -s {} + >| /tmp/tmp.txt; cat tmp.txt | awk '{total = total + $1}END{print total}'

Produz:

145070492

Para forçar a saída a ser legível:

find /home/somedirectory/ -exec du -s {} + >| /tmp/tmp.txt; cat tmp.txt | awk '{total = total + $1}END{print total}' | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'

Produz:

138.35MB

O que está acontecendo aqui:

/home/somedirectory/      directory to search.
-exec du -s               for each result run a du -s producing bytes
+ >| /tmp/tmp.txt         alliance between find and du, force overwrite tmp.txt
first awk '...'           get the first token of every line and add them up
second awk '...'          take the number and divide by 1024 twice to produce MB
    
por 29.11.2018 / 19:00