Como obter o tamanho da pasta ignorando links físicos?


16

Eu uso o rsnapshot para backups, que gera uma série de pastas contendo arquivos com o mesmo nome. Alguns dos arquivos estão com vínculo físico, enquanto outros são separados. Por exemplo, hourly.1/file1e hourly.2/file1pode estar fortemente vinculado ao mesmo arquivo, enquanto hourly.1/file2e hourly.2/file2são arquivos totalmente separados.

Quero encontrar a quantidade de espaço usada pela pasta, hourly.2 ignorando todos os arquivos que são links físicos para arquivos hourly.1. Portanto, no exemplo acima, eu gostaria de obter o tamanho do arquivo2, mas ignore o arquivo1.

Estou usando o bash no linux e quero fazer isso na linha de comando da maneira mais simples possível, para que não haja grandes soluções gráficas ou outras soluções apenas para o sistema operacional.

Respostas:


7

Tamanho total em bytes de todos os arquivos nos hourly.2quais há apenas um link:

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

Da findpágina de manual:

   -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.


11
Se um arquivo em algum lugar estiver vinculado a um arquivo hourly2, seu comando executará a resposta errada.
precisa saber é

@Gnouc - Bem, sim - depende de como os arquivos terminam hourly.2. Se eles forem copiados para lá, eles não terão links extras e meu comando funcionará. Se eles estiverem vinculados, obviamente falhará. Estou assumindo que novos arquivos de backup são copiados.
grebneke

11

Se você deseja especificamente o tamanho dos arquivos presentes abaixo, hourly.2mas não abaixo hourly.1, é possível obtê-lo um pouco indiretamente com du. Se duprocessar o mesmo arquivo mais de uma vez (mesmo sob nomes diferentes, por exemplo, links físicos), ele só conta o arquivo na primeira vez. Então, o que os du hourly.1 hourly.2relatórios têm para hourly.2o tamanho que você está procurando. Portanto:

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. Supõe que o nome do diretório hourly.1não contenha nenhuma nova linha.)


Por alguma estranha razão, du nem sempre nota arquivos vinculados no RHEL5 - se eu fizer 'du -sh dir / sub dir', a saída para dir será a mesma que se eu tivesse dito apenas 'du -sh dir' - sem excluir o tamanho de 'dir / sub'.
Andreas Krey

8

Como o @Gilles diz, como duconta apenas o primeiro de todos os hardlinks apontando para o mesmo inode encontrado, você pode fornecer diretórios seguidos:

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

Ou seja, qualquer arquivo em 'hourly.2' que faça referência a um inode (também conhecido como arquivo "real") já mencionado em 'hourly.1', não será contado.


2
De acordo com du --help , a opção --max-depth = 0 é equivalente a -s , portanto, acima pode ser abreviado como:$ du -hcs dirA dirB
akavel

1

Incrivelmente compilações de BusyBox findvem sem -printfsuporte. Aqui está uma modificação na resposta do @ grebneke :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'

1

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
...

Obrigado Abdel. Essa deve ser a resposta aceita.
TiberiusKirk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.