Lista de argumentos muito longa ao usar du

3

Eu tenho um comando para encontrar arquivos grandes em uma determinada pasta, mas, por algum motivo, ele não funciona em certas situações e eu recebo um erro "Argument list too long". Como corrijo este comando para que funcione sempre?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long
    
por Joel Smith 25.10.2016 / 20:17

6 respostas

4

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 find suporta a notação + .

Isso localizará tudo sob o diretório atual sem descer mais profundamente e ignorará o "." (obrigado por esse lembrete @rudimeier!)

Isso incluirá todos os arquivos no diretório atual, como o glob que você tinha originalmente. Ao contrário desse glob, isso também encontrará arquivos que começam com . (a menos que você esteja jogando com suas opções de shell para ativar dotglob já).

    
por 25.10.2016 / 20:24
1
sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10
    
por 25.10.2016 / 21:41
1

Com versões recentes do GNU coreutils, você pode usar o --max-depth option em vez de enumerar os arquivos com * . Dessa forma, você não arrisca entrar no limite de comprimento da linha de comando se houver muitos arquivos. Não há --min-depth , portanto, o diretório de nível superior será listado no final.

du -x -d 1 | head -n -1 | sort -r | head -n 10
    
por 26.10.2016 / 02:23
1

Cheguei a essa questão enquanto procurava uma maneira de lidar com "a lista de argumentos por muito tempo" com du . No meu caso, não queria filtrar a saída, mas sim obter um total de todos os arquivos que correspondam a um padrão. Com as abordagens em outras perguntas, não consegui um total geral, pois elas acabam chamando du várias 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 seguem links simbólicos para encontrar e calcular o tamanho.
  • -c obtém o total acumulado
  • <() substituição de processo para criar file on the fly
  • -print0 para corresponder à expectativa de du
  • \( \) para poder usar -o com dois -name args

Da mesma forma, a resposta para a pergunta acima poderia ser:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10
    
por 26.01.2018 / 16:18
0

Este é um problema comum que as linhas de comando não são ilimitadas em tamanho e número de argumentos. Uma maneira comum de contornar esses limites é usar find / xargs pipes.

Seu caso deve funcionar assim:

 sudo sh -c "find . -mindepth 1 -maxdepth 1 -print0 |xargs -0 du -hsx -- " |sort -rh |head
A exigência de

sudo faz com que pareça um pouco mais complicado que o normal.

    
por 25.10.2016 / 20:24
-1

Você pode contornar isso com find , se souber o limite mínimo para o tamanho do arquivo que deseja ver:

find /tmp -size 1G -type f
    
por 25.10.2016 / 20:24