Lista de argumentos muito longa ao usar du

Lista de argumentos muito longa ao usar du

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 findem vez de globbing e fazê-lo

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

assumindo que você findsuporta 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ê dotglobjá 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 dudiversas 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)
  • -Lsiga os links simbólicos tanto na localização quanto no cálculo do tamanho.
  • -cobter o total acumulado
  • <()substituição de processo para criar um processo fileem tempo real
  • -print0para corresponder duà expectativa
  • \( \)para poder usar -ocom dois -nameargumentos

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-depthopçã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

informação relacionada