Listar arquivos classificados pelo número de linhas que eles contêm

28

Como posso listar o número de linhas nos arquivos em /group/book/four/word , classificados pelo número de linhas que eles contêm?

O comando

ls -l lista-os mas não os ordena

    
por Ken R 27.11.2014 / 13:31

5 respostas

30

Você deve usar um comando como este:

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
  • find : procura por arquivos no caminho que você deseja. Se você não quiser recursiva, e sua implementação de find for compatível, adicione -maxdepth 1 antes da opção -exec .
  • exec : diz ao comando para executar wc -l em cada arquivo.
  • sort -rn : classifica os resultados numericamente na ordem inversa. De maior para menor.

(que supõe que os nomes dos arquivos não contêm caracteres de nova linha).

    
por 27.11.2014 / 13:34
9

Não recursivo

Provavelmente a versão mais simples, se você não precisar de recursividade:

wc -l /group/book/four/word/*|sort -n

wc contagens de linhas (opção -l ) em todos os arquivos (mas ocultos) ( * ) em /group/book/four/word/ e sort classifica o resultado (através do canal | ) numericamente (opção -n ).

Recursivo

Alguém fez um comentário para esta resposta mencionando grep -rlc antes de 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 ) recursivamente (opção -r ) linhas correspondentes ( grep ) '^' (isto é, início de linhas) no diretório /group/book/four/word/ . Então você tem que substituir os dois pontos por um espaço, por exemplo usando tr , para ajudar sort , que você 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 se livrar de tr .

    
por 27.11.2014 / 21:17
7

com zsh :

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

Definimos uma nova função classificação lines que responde com o número de linhas no arquivo. E usamos o qualificador o+lines glob que, junto com n (para classificação numérica), define como os resultados do glob são ordenados. ( . também adicionado para verificar apenas arquivos regulares).

Isso não faz nenhuma suposição sobre qual caractere os nomes de arquivos podem conter além dos arquivos ocultos (aqueles que começam com . ) são omitidos. Adicione o qualificador D glob, se desejar também.

    
por 27.11.2014 / 13:38
4

Você não especifica se deseja também os arquivos em qualquer subdiretório de /group/book/four/word . A solução find na resposta de jherran irá 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
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
" "$(wc -l < "$file")" "$file" done | sort -zn | tr '
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
' '\n'

Por fim, se você fizer quiser descer em subdiretórios, poderá usar isso em bash 4 ou acima:

for file in ./*; do 
    [ -f "$file" ] && 
        printf "%lu %s
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
" "$(wc -l < "$file")" "$file" done | sort -zn | tr '%pre%' '\n'

Observe que as versões de bash anteriores a 4.3 estavam seguindo os links simbólicos ao descer de forma recursiva a árvore de diretórios (como zsh 's ou tcsh ' ***/* ).

Além disso, todas as soluções acima irão ignorar arquivos ocultos (aqueles cujo nome começa com . , use shopt -s dotglob para incluí-los) e também incluirão a contagem de linha de links simbólicos (que a abordagem find não ).

    
por 27.11.2014 / 14:39
1

Se você quiser instalar fd um localizador de arquivos realmente rápido escrito em Rust (você deve instalá-lo, é ótimo tem de qualquer maneira)

fd --type=file . | xargs wc -l | sort -n

Basicamente, fd lista os arquivos, xargs passa a lista de arquivos para wc (significa contagem de palavras, mas passando -l fará com que conte linhas) e, finalmente, ele é classificado de menor número de linhas para maior usando% código%.

    
por 25.03.2019 / 13:31