Oracle Linux 6.7 -bash: /usr/bin/du: Lista de argumentos muito longa

Oracle Linux 6.7 -bash: /usr/bin/du: Lista de argumentos muito longa

Tenho um caminho de cerca de 1 milhão de pastas com tamanho total de 300 GB. Quando executo o du -sh *comando, recebo o erro que mencionei no título. Como posso combinar o using xargscom esse comando ou vai xargsresolver meu problema? No entanto, ainda preciso de um comando separado para localizar pastas maiores que 20 GB no mesmo caminho. Precisa de ajuda para usar esses dois comandos.

Exemplo de caminho:/data/dataold/exports/

A saída deve ser como abaixo (você pode pensar no que afirmei abaixo como os nomes de arquivos e pastas no caminho principal que especifiquei na linha acima):

4.0K xyz.sh
12K asdasda.txt
10G QWERT
1G ASDFGH

Atenciosamente.

Responder1

Uma opção é usar find, mas sugiro uma das outras soluções mostradas abaixo.

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;

Supondo que /data/dataold/exportscontenha os subdiretórios

foo
bar
baz

(e talvez mais), ele será executado

du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz

etc.

A opção -mindepthevita executar o ducomando for /data/dataold/exportse -maxdepthevita isso para subdiretórios de um subdiretório, por exemplo, for /data/dataold/exports/foo/something.

Como sugerido emcaso'comente, você pode usar

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+

em vez de ... -exec du -sh {} \;, se a sua versão findsuportar isso. Com +em vez de ;, findserá executado duuma vez para cada vez que o buffer de arg do Linux for preenchido (aproximadamente 2 MB) em vez de executá-lo uma vez para cada arquivo/diretório. O primeiro émuitomais rápido.

CitandoStéphane Chazelas'comentário: "Observe que chamar várias invocações independentes de du(como with find -exec) pode fornecer números diferentes se houver links físicos nesses diretórios de nível superior, pois eles não serão desduplicados se forem encontrados por diferentes invocações de du."


Com o GNU duvocê pode limitar a profundidade a ser exibida usando a opção -dou --max-depth=N:

du -h -d 1 /data/dataold/exports

Isso fará o cálculo para todos os subdiretórios, mas limitará a saída a uma profundidade de 1 abaixo do ponto inicial, portanto, no exemplo mostrado acima, ele deverá imprimir o tamanho total para

/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz

etc e para

/data/dataold/exports

A segunda solução, se disponível, deve ser preferida porque não precisa iniciar um novo duprocesso para cada subdiretório (no caso de -exec ... \;) ou para cada conjunto de subdiretórios que preencha o buffer de argumentos (no caso de -exec ... \+).

Se a sua versão dunão suportar a opção, -dvocê pode usar

du -h /data/dataold/exports

e filtre a saída para remover tudo abaixo do primeiro nível de subdiretórios.


Se você quiser filtrar a saída por comparação numérica, sugiro omitir a opção -h. Para evitar esperar pelo acesso lento ao sistema de arquivos enquanto testa a filtragem, sugiro redirecionar a saída para um arquivo, por exemplo

du -d 1 /data/dataold/exports > outputfile

ou

du -d 1 /data/dataold/exports 2>errors | tee outputfile

e processar o conteúdo outputfileposteriormente.

Exemplo:

awk '$1 > 20e9` outputfile

Se a sua duopção não for compatível, -dvocê pode usar algo como

du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile

Isso imprimirá todas as linhas que possuem um número maior que 20 * 10^9 no primeiro campo e um valor que não contém 5 (ou mais) barras no segundo campo. O número de barras na segunda condição é adaptado ao diretório inicial /data/dataold/exportse será impresso, por exemplo, /data/dataold/exports/foomas não por exemplo /data/dataold/exports/foo/bar.

Responder2

Tente não resumir e depois deixe duo trabalho. Aplique sortcom -hpedido humano e limite em um tamanho específico:

du -h /data/dataold/exports/ | sort -h

use -rin sortpara listar na ordem inversa, ou seja, arquivos grandes para pequenos.

Para selecionar o tamanho, um truque simples awkserviria:

du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h 

Ou seja: use G(da saída de tamanho GB) como separador de campo, verifique se o campo é apenas um número (para excluir correspondências erradas com o separador G) e selecione apenas números maiores que 20. A classificação é opcional aqui.

informação relacionada