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 xargs
com esse comando ou vai xargs
resolver 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/exports
contenha 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 -mindepth
evita executar o du
comando for /data/dataold/exports
e -maxdepth
evita 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 find
suportar isso. Com +
em vez de ;
, find
será executado du
uma 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 du
você pode limitar a profundidade a ser exibida usando a opção -d
ou --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 du
processo 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 du
não suportar a opção, -d
você 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 outputfile
posteriormente.
Exemplo:
awk '$1 > 20e9` outputfile
Se a sua du
opção não for compatível, -d
você 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/exports
e será impresso, por exemplo, /data/dataold/exports/foo
mas não por exemplo /data/dataold/exports/foo/bar
.
Responder2
Tente não resumir e depois deixe du
o trabalho. Aplique sort
com -h
pedido humano e limite em um tamanho específico:
du -h /data/dataold/exports/ | sort -h
use -r
in sort
para listar na ordem inversa, ou seja, arquivos grandes para pequenos.
Para selecionar o tamanho, um truque simples awk
serviria:
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.