Respostas:
Você deve usar um comando como este:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: pesquise arquivos no caminho que você deseja. Se você não deseja que seja recursivo e sua find
implementação o suporte, você deve adicionar um -maxdepth 1
pouco antes da -exec
opção.exec
: diz ao comando para executar wc -l
em todos os arquivos.sort -rn
: classifique os resultados numericamente na ordem inversa. De maior para menor.(que assume que os nomes dos arquivos não contêm caracteres de nova linha).
wc
também imprimirá uma total
linha; portanto, você também terá uma ou mais linhas "totais", a menos que haja apenas um arquivo . Você pode canalizar grep /
para removê-los.
sort
comando
Provavelmente a versão mais simples se você não precisar de recursividade:
wc -l /group/book/four/word/*|sort -n
wc
conta as linhas (opção -l
) em todos os *
arquivos (exceto os ocultos) ( ) abaixo /group/book/four/word/
e sort
classifica o resultado (através do canal |
) numericamente (opção -n
).
Alguém fez um comentário a esta resposta mencionando grep -rlc
antes para suprimi-la. De fato, grep
é uma ótima alternativa, especialmente se você precisar de recursividade:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
contará (opção -c
) de forma recursiva (opção -r
) linhas de correspondência ( grep
) '^'
(isto é, a partir de linhas) no diretório /group/book/four/word/
. Então você deve substituir os dois pontos por um espaço, por exemplo, usando tr
, para ajudar sort
, que deseja classificar numericamente (opção -n
) na segunda coluna (opção -k2
).
Atualização: Veja o comentário de Stephane sobre possíveis limitações e como você pode realmente se livrar tr
.
grep -c .
conta as linhas que contêm pelo menos um caractere válido. Use grep -c '^'
para contar todas as linhas (também contará caracteres à direita após a última nova linha com algumas grep
implementações). Observe que nem todas as grep
implementações suportam -r
ae o comportamento varia entre as que o fazem. Você não precisa converter :
s (dois pontos, e não ponto e vírgula) em espaços para sort
. Apenas use -t:
. Observe que isso pressupõe que os nomes dos arquivos não contenham :
caracteres em branco ou nova linha.
wc
dava um total tão útil se você passasse por vários caminhos. O acoplamento dessa funcionalidade ao curinga e ao tubo sort
é realmente limpo.
Com zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Definimos uma nova função de classificaçãolines
que responde com o número de linhas no arquivo. E usamos o o+lines
qualificador glob que, junto com n
(para classificação numérica), define como os resultados da glob são ordenados. ( .
também adicionado para verificar apenas arquivos regulares).
Isso não assume que tipo de caractere os nomes de arquivo podem conter, exceto os arquivos ocultos (aqueles iniciados por .
) são omitidos. Adicione o D
qualificador glob se você também quiser.
bash
apenas ...
Você não especifica se também deseja os arquivos em qualquer subdiretório de /group/book/four/word
. A find
solução na resposta de jherran descerá em subdiretórios. Se isso não for desejado, use o shell:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Se os nomes dos seus arquivos puderem conter novas linhas, você poderá usar algo como:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Finalmente, se você faz querer descer para os subdiretórios, você pode usar isso em bash
4 ou superior:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Observe que as versões bash
anteriores à 4.3 seguiam links simbólicos ao descer recursivamente a árvore de diretórios (como zsh
's ou tcsh
' s ***/*
).
Além disso, todas as soluções acima ignoram os arquivos ocultos (aqueles cujo nome começa com a .
, costumam shopt -s dotglob
incluí-los) e também incluem a contagem de linhas de links simbólicos (que a find
abordagem não incluirá).
-xtype f
no GNU find ou *(-.)
no zsh) e omitirá os arquivos ocultos.
%lu
in printf
? Pelo que me lembro, isso significa decimal longo sem sinal, é realmente necessário? Por que não tratar o número como uma string? Isso faz diferença?
0
vez da string vazia, que é um pouco melhor. Algumas implementações de classificação funcionam com números inteiros não assinados, outros com assinados. %lu
parece a aposta mais segura, mas provavelmente não importa como se você tivesse 2^31
linhas, isso levará anos de qualquer maneira.
Se você deseja instalar fd
um localizador de arquivos muito rápido, escrito em Rust (você deve instalá-lo, é ótimo ter mesmo assim)
fd --type=file . | xargs wc -l | sort -n
Basicamente, fd
lista os arquivos, o xargs passa a lista de arquivos wc
(significa contagem de palavras, mas passar -l fará com que conte linhas) e, finalmente, é classificado do menor número de linhas para o maior uso sort -n
.
ls -l
não fornece o número de linhas.ls -lS
classifica o arquivo por tamanho com algumasls
implementações ( tamanho sendo o número de bytes no conteúdo).