Como exibir tamanhos de arquivo “legíveis por humanos” nos resultados da busca?

11

Estou tentando encontrar todos os arquivos grandes no meu servidor Centos. Para fazer isso, estou usando:

find / -maxdepth 10 -size +100000 -ls

Tentei mudar -lspara -lshmas não é permitido.

Como posso exibir esses resultados com tamanhos legíveis por humanos (usando os sufixos k, M,…)?

blarg
fonte
Qual é a sua definição para legível por humanos? Para mim, isso é legível por humanos.
precisa saber é o seguinte
Você deve tentar usar o fileutilitário find.
Ramesh
@manatwork kb, mb, gb
blarg

Respostas:

10

findnão tem opções sofisticadas como ls. Se você quiser ls -h, precisa ligar ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Eu recomendo a -xdevopção de evitar a recursão em outros sistemas de arquivos, o que seria inútil se você estiver preocupado com o espaço em disco.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Se você usar o zsh como seu shell, em vez de usá- findlo, poderá usar qualificadores glob. Limitar o tamanho do arquivo é simples: Lseguido por um tamanho; o tamanho pode ter uma unidade opcional antes do número. Se você não se importa com a profundidade máxima, pode **/recursar em subdiretórios. Se você se preocupa com a profundidade máxima, é mais complicado, pois os padrões zsh glob não têm como expressar "no máximo n ocorrências". Para evitar a recursão entre dispositivos, use o dqualificador glob; você precisa encontrar o número do dispositivo, que pode ser exibido com o statcomando no Linux ( stat -c %d /para exibir apenas o número) ou com o próprio zsh statembutido (execute zmodload zsh/statpara carregá-lo).

ls -lh /**/*(L+M99d$(stat -c %d /))
Gilles 'SO- parar de ser mau'
fonte
4

O comando que você está tentando é legível para mim. No entanto, você pode fazer uso do utilitário de arquivo com a localização abaixo.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Outra maneira de fazer isso é usar o comando abaixo.

du -BM / | sort -nr

O comando acima fornecerá os arquivos no tamanho classificado.

Se você estiver usando coreutils> 7.5 , poderá emitir o comando abaixo para listar os arquivos por tamanhos.

du -ah / | grep -v "/$" | sort -h

Na minha máquina, eu não tinha a sort -hopção disponível.

Como você mencionou no comentário, seu formato legível para humanos é que o arquivo deve ter o tamanho em kb , mb ou gb . Eu iria com o segundo comando que eu tinha postado como resposta. A saída que obtive quando a usei no meu sistema é,

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking
Ramesh
fonte
Existe uma maneira de definir um limite inferior para o seu segundo comando? Os maiores arquivos aparecem no topo e desaparecer rapidamente fora do topo do EDIT shell - Vejo você só tem que remover o r
blarg
Você pode redirecionar a saída para um arquivo adicionando > outputao comando Depois, você pode abrir o arquivo e ver a saída como você deseja :)
Ramesh
Vejo Isso exibe pastas também, enquanto eu sou somente após arquivos
blarg
du -a --max-depth=10 / | sort -rné o fim que eu poderia chegar. No entanto, nesse caso, ele não exibirá o tamanho em KB, MB ou GB.
Ramesh
1

Eu acho que o que você está procurando é mais como o seguinte.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

O -execpermite executar um comando e o {}é substituído pelo resultado da localização. Por fim, o +é dizer é encontrar o final do comando e é necessário.

Tim Hughes
fonte
2
Na verdade, é completamente desnecessário citar o {}aqui. As aspas simples no comando são para o shell, mas o shell nunca verá o ls -lah <args...>comando - ele vê {}, o que não precisa ser citado. É findque vê o ls -lah {}e é findque expande o {}, e, como está implícito no nome da -execopção, findusa uma exec*chamada de sistema diretamente nos argumentos, para que não haja problemas com espaços porque findnão fará divisão de palavras nos seus nomes de arquivos.
Jw013
1
A -aopção para lsé desnecessária, pois os argumentos devem ser arquivos e não diretórios. O GNU encontra usos ls -dilspara a -lsopção, de modo a replicar o mais próximo possível ls -dilsh.
jw013
O comando man find fornece o seguinte para o primeiro exemplo do uso de -exec : find . -type f -exec file '{}' \; Executa o arquivo em todos os arquivos no diretório atual ou abaixo dele. Observe que os colchetes estão entre aspas simples para protegê-los da interpretação como pontuação do script do shell. O ponto-e-vírgula é igualmente protegido pelo uso de uma barra invertida, embora aspas simples também possam ter sido usadas nesse caso.
Tim Hughes
1
A página de manual simplesmente defende cautela desnecessária. Não vai doer, mas não conheço nenhum shell que precise {}ser citado.
jw013