Como obter o tamanho da pasta ignorando os hard links?

15

Eu uso rsnapshot para backups, o que gera uma série de pastas contendo arquivos de mesmo nome. Alguns dos arquivos são vinculados, enquanto outros são separados. Por exemplo, hourly.1/file1 e hourly.2/file1 podem estar com link físico para o mesmo arquivo, enquanto hourly.1/file2 e hourly.2/file2 são arquivos totalmente separados.

Eu quero encontrar a quantidade de espaço usada pela pasta hourly.2 ignorando quaisquer arquivos que sejam links físicos para arquivos em hourly.1 . Então, no exemplo acima, eu gostaria de obter o tamanho do arquivo2, mas ignorar o arquivo1.

Estou usando o bash no linux, e quero fazer isso da linha de comando da maneira mais simples possível, por isso, sem grandes soluções gráficas ou somente com SO, por favor.

    
por Benubird 05.03.2014 / 10:40

5 respostas

6

Tamanho total em bytes de todos os arquivos em hourly.2 que têm apenas um link:

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

De find man-page:

   -links n
          File has n links.

Para obter a soma em kilobytes em vez de bytes, use -printf "%k\n"

Para listar arquivos com diferentes contagens de links, brinque com find -links +1 (mais de um link), find -links -5 (menos de cinco links) e assim por diante.

    
por 05.03.2014 / 10:59
10

Se você deseja especificamente o tamanho dos arquivos que estão presentes em hourly.2 , mas não em hourly.1 , é possível obtê-lo indiretamente com du . Se du processar o mesmo arquivo mais de uma vez (mesmo sob nomes diferentes, ou seja, links físicos), ele contará o arquivo pela primeira vez. Então, o que du hourly.1 hourly.2 relata para hourly.2 é o tamanho que você está procurando. Assim:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(Funciona em qualquer sistema POSIX e na maioria das outras variantes do Unix. Presume-se que o nome do diretório hourly.1 não contenha nenhuma nova linha.)

    
por 06.03.2014 / 02:17
7

Como diz @Gilles, uma vez que du conta apenas o primeiro de todos os hardlinks apontando para o mesmo inode que encontra, você pode dar a ele os diretórios seguidos:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

Ou seja. qualquer arquivo em 'hora2' referenciando um inode (também conhecido como arquivo "real") já referenciado em 'hora1', não será contado.

    
por 24.02.2015 / 13:01
1

As compilações do Awesomely BusyBox de find vêm sem -printf support. Aqui está uma modificação para a @ resposta do grebneke :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'
    
por 22.04.2014 / 07:51
0

Mais simples

du -hc --max-depth=1 path/

Exemplo

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...
    
por 27.09.2018 / 16:05