![Lista de argumentos muito longa ao usar du](https://rvso.com/image/97215/Lista%20de%20argumentos%20muito%20longa%20ao%20usar%20du.png)
Eu tenho um comando para encontrar arquivos grandes em uma pasta específica, mas por algum motivo ele não funciona em determinadas situações e recebo um erro "Lista de argumentos muito longa". Como faço para corrigir esse comando para que funcione sempre?
jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long
Responder1
Você poderia substituir esse comando por find
em vez de globbing e fazê-lo
sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10
assumindo que você find
suporta a +
notação.
Isso encontrará tudo no diretório atual sem se aprofundar e ignorará o "." (obrigado por esse lembrete @rudimeier!)
Isso incluirá todos os arquivos do diretório atual, como o glob que você tinha originalmente. Ao contrário desse glob, ele também encontrará arquivos que começam com .
(a menos que você dotglob
já esteja brincando com as opções do shell para ativar).
Responder2
Cheguei a essa questão enquanto procurava uma maneira de lidar com "lista de argumentos muito longa" com du
. No meu caso, eu não queria filtrar a saída, mas sim obter um total de todos os arquivos que correspondem a um padrão. Com as abordagens em outras questões não consegui obter um total geral pois elas acabam ligando du
diversas vezes com um subconjunto de argumentos.
A solução foi usar --files0-from=
em vez de passar nomes de arquivos como argumentos.
No final, isso funcionou para mim:
du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
-L
siga os links simbólicos tanto na localização quanto no cálculo do tamanho.-c
obter o total acumulado<()
substituição de processo para criar um processofile
em tempo real-print0
para corresponderdu
à expectativa\( \)
para poder usar-o
com dois-name
argumentos
Da mesma forma, a resposta à pergunta acima poderia ser:
du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10
Responder3
Com versões recentes do GNU coreutils, você pode usar o--max-depth
opçãoem vez de enumerar os arquivos com *
. Dessa forma, você não corre o risco de atingir o limite de comprimento da linha de comando se houver muitos arquivos. Não existe --min-depth
, então o diretório de nível superior será listado no final.
du -x -d 1 | head -n -1 | sort -r | head -n 10
Responder4
sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10