Solicite todos os arquivos por tamanho usando find

0

Como prática, preciso concluir um script que ordene todos os preenchimentos por tamanho com uma determinada extensão (.txt, por exemplo), incluindo aqueles em subdiretórios também.

For example; 
./ex1.sh einstein txt
einstein/copyright.txt
einstein/do-how.txt
einstein/etext9/bil11.txt
einstein/etext9/2ws271.txt
einstein/etext9/liber11.txt
einstein/etext0/bib0010h/Readme.txt
einstein/etext0/kknta10.txt

Eu não posso usar du ou outros comandos avançados. Em algum momento eu preciso usar find, eu tentei algo assim

find -depth - type f -name "*.$extension" | sort ....

mas isso não funciona muito bem, já que eu não sei como classificá-los por tamanho, apenas o resultado que recebo é classificado pelo nome.

Eu estava procurando por uma saída semelhante a ls -lhS, mas incluindo subdiretórios.

    
por Arnau Martínez 15.03.2018 / 13:02

4 respostas

0

find inclui uma opção -printf , que permite formatar o resultado a ser exibido sobre seus resultados e como gerá-los. Uma das possibilidades listadas na documentação para essa opção (consulte a página man ) é %s para o tamanho de um arquivo em bytes. Assim, você pode adicionar ao seu comando de busca algo como '-printf "% s% p \ n".

    
por 15.03.2018 / 13:15
2

A única classificação que qualquer um dos find s pode fazer AFAIK é ter conteúdo exibido antes do diretório contido (a opção -depth ). Você terá que usar outra coisa para classificar em tamanho.

Se você encontrou o GNU, tente:

find . -type f -iname "*.$extension" -printf "%s %p\n" | sort -n | sed 's/^[0-9]* //'

-printf "%s %p\n" imprime o tamanho e o caminho do arquivo, depois ordenamos numericamente e, em seguida, removemos o tamanho usando sed .

    
por 15.03.2018 / 13:11
1

com zsh :

printf '%s\n' **/*.$extension(D.oL)

Para obter uma saída do tipo ls -lh do GNU, com GNU ls :

ls -Ulhd -- **/*.$extension(D.oL)

Ou se a lista for muito grande:

autoload zargs # best in ~/.zshrc
zargs --eof= -- **/*.$extension(D.oL) '' ls -Ulhd --

Ou

printf '%s
printf '%s
printf '%s\n' **/*.$extension(D.oL)
' ./**/*.$extension(D.oL) | xargs -r0 sh -c ' exec find "$@" -prune ...' sh
' **/*.$extension(D.oL) | xargs -r0 ls -Ulhd --

Se, por algum motivo, você precisar usar find , você sempre poderá fazer:

ls -Ulhd -- **/*.$extension(D.oL)
    
por 15.03.2018 / 13:13
0

eu uso

   find . -type f -iname "*.$extension" -print0 | xargs -0 ls -lS

isso funciona bem para mim

    
por 15.03.2018 / 13:59