Considere uma estrutura de diretórios da seguinte forma:
$ ls -sR1
.:
total 32
4 1/
4 2/
4 m
4 n
4 o
4 x.pdf
4 y.pdf
4 z.pdf
./1:
total 0
./2:
total 8
4 a/
4 p
./2/a:
total 4
4 q
Em seguida, para obter uma lista de todos os arquivos que não correspondem a *.pdf
, podemos fazer
$ find . -type f \( ! -name '*.pdf' \)
cuja expansão também não corresponde, por exemplo, *.jpg
é bastante óbvia. Em seguida, use du
da seguinte forma:
$ du -c $(find . -type f \( ! -name '*.pdf' \))
4 ./o
4 ./m
4 ./n
4 ./2/a/q
4 ./2/p
20 total
onde você pode querer lançar um -b
para obter o tamanho aparente em bytes, em vez do uso do disco. -c
dá o total geral.
As limitações desta abordagem são:
- Não funcionará se a sua árvore de diretórios for muito grande, porque
- Porque ele verifica a árvore duas vezes (
find
+du
) - Porque ele alimenta a saída de
find
emdu
por meio da linha de comando e, portanto, é limitado pelo tamanho máximo permitido para isso.
- Porque ele verifica a árvore duas vezes (
- Irá (nessa abordagem ingênua) corresponder apenas aos arquivos com base em seus nomes, não no conteúdo deles.
Você pode superar 1. usando find
para executar du
em cada arquivo individual e, em seguida, usar awk
ou algo semelhante para adicioná-lo. 2. pode ser resolvido com verificações mais intrigantes em find
, possivelmente com base na saída de file
para cada arquivo e comparando-o com uma lista positiva ou negativa.