Classifique todos os arquivos de texto por tamanho, produzindo uma lista de texto de caminhos

Classifique todos os arquivos de texto por tamanho, produzindo uma lista de texto de caminhos

Isso me dá uma lista de caminhos para todos os arquivos de texto:

find / -type f -name '*.txt' > ~/Desktop/sorted.txt

Gostaria de classificar esta lista de caminhos de acordo com o tamanho do arquivo de cada item, mas não tenho certeza do que usar. Isso não funciona como eu esperava:

find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt

Alguma sugestão?

Responder1

Este comando usa um wcprocesso separado para cada arquivo correspondente, portanto seu desempenho pode ser ruim. Eu o criei tendo em mente a compatibilidade e a conformidade com POSIX.

find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-

Cada um wc -cgera uma linha em um formulário

12345 /path/to/file/possibly with spaces/foo.txt

onde o primeiro espaço separa a contagem de bytes do caminho. sortobtém todas as linhas, usa o caractere de espaço como separador de campo e classifica numericamente de acordo com o primeiro campo, ou seja, de acordo com a contagem de bytes. Em seguida, cutusa o caractere de espaço como delimitador de campo e imprime a partir do segundo campo, ou seja, tudo menos o primeiro campo, ou seja, tudo menos o byte conta, ou seja, os caminhos.

A solução pode ser facilmente adaptada para classificar por contagem de linhas: basta usar wc -lem vez de wc -c.


Nota:
Um caminho contendo um ou mais caracteres de nova linha quebrará meu código. Para tornar o código imune a isso, pode-se usar ferramentas que suportem caracteres nulos como delimitadores. Com as ferramentas POSIX isso é difícil, se é que é possível. Esta resposta concentra-se na portabilidade, portanto, esperamos que todos os caminhos para seus arquivos de texto sejam "agradáveis".

Responder2

Você sempre pode optar pela abordagem (provavelmente abaixo do ideal) de encadear ferramentas:

find / -type f -name '*.txt' -ls  | sort -nk7,7 | awk '{print $NF;}'
  • A -lsativação do find mostrará uma série de colunas extras, incluindo o tamanho do arquivo (no conjunto de ferramentas GNU, a 7ª coluna pode ser diferente no MacOS)
  • O sortfará uma classificação numérica na 7ª coluna (tamanho do arquivo)
  • Remove awktodos os outros campos e imprime apenas o nome do arquivo

informação relacionada