script que lista todos os arquivos em um diretório e subdiretórios classificados por tamanho, listando apenas os nomes de arquivos que não são caminhos completos

2

Estou procurando um script que liste todos os arquivos em um diretório e subdiretórios classificados por tamanho, listando apenas os nomes de arquivos que não são caminhos completos.

find . -type f -exec ls -lhS {} \+ funciona, mas fornece o caminho.

find . -type f -printf '%f\n' também funciona, mas não tenho certeza de como classificá-lo ou se é possível incluir os tamanhos de arquivo aqui também.

    
por Roman 29.01.2015 / 01:16

2 respostas

2

Se o seu find for compatível, você poderá usar %s em -printf ("Tamanho do arquivo em bytes").

Se o seu sort suportar entrada delimitada por nul ( -z ), você poderá fazer:

find . -type f -printf "%s %f
find . -type f -printf "%s %f%pre%" | sort -nz | tr '%pre%' '\n'
" | sort -nz | tr '%pre%' '\n'
    
por 29.01.2015 / 01:39
2

Se o seu sistema suporta o comando zsh , então no script bash você pode executar

zsh -c 'ls -lhS -- **/*(.D)'

Isso provavelmente requer alguma explicação:

  • zsh : diferente de bash , shell mais poderoso com muitos recursos
  • -c : toma o próximo argumento como um comando para executar por zsh
  • ls -lhS : de acordo com a sua pergunta, este é o comando que você deseja executar
  • -- : cuida de nomes de arquivos estranhos que podem começar com - character
  • ** : glob correspondendo a vários directórios
  • * : standard glob - correspondendo todos os arquivos nesses diretórios
  • () : qualificadores glob especificando quais arquivos e em qual ordem devem ser selecionados
  • . : selecionamos apenas arquivos simples (equivalente a type f em find )
  • D : inclua arquivos de pontos (arquivos ocultos) no resultado

Depois de reler a pergunta, suponho que você queira excluir o caminho inteiro do resultado, não apenas a parte principal. Isso ainda pode ser feito com zsh :

print -l **/*(.OLDe:'reply=${REPLY##*/}':)

mas isso pode ser um pouco demais, já que isso não é questão sobre zsh truques, então vou propor uma solução "padrão" com find + sed :

find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+
    
por 29.01.2015 / 02:28