Réponses:
Vous devriez utiliser une commande comme celle-ci:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: rechercher des fichiers sur le chemin que vous voulez. Si vous ne le souhaitez pas et que votre find
implémentation le prend en charge, vous devez l'ajouter -maxdepth 1
juste avant l' -exec
option.exec
: indique à la commande à exécuter wc -l
sur chaque fichier.sort -rn
: trier les résultats numériquement dans l’ordre inverse. De plus en plus bas.(cela suppose que les noms de fichiers ne contiennent pas de caractères de nouvelle ligne).
wc
imprimera également une total
ligne, donc ici vous aurez aussi une ou plusieurs lignes "totales" à moins qu'il n'y ait qu'un seul fichier . Vous pouvez diriger pour grep /
les supprimer.
sort
commandement
Probablement la version la plus simple si vous n'avez pas besoin de récursivité:
wc -l /group/book/four/word/*|sort -n
wc
compte les lignes (option -l
) dans tous les *
fichiers (mais cachés) ( ) sous /group/book/four/word/
, et sort
trie le résultat (par le biais du canal |
) numériquement (option -n
).
Quelqu'un a commenté cette réponse grep -rlc
avant de la supprimer. En effet, grep
c’est une excellente alternative, surtout si vous avez besoin de récursivité:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
comptera (option -c
) récursivement (option -r
) lignes correspondantes ( grep
) '^'
(c'est-à-dire, début de lignes) dans le répertoire /group/book/four/word/
. Ensuite, vous devez remplacer les deux points par un espace, par exemple en utilisant tr
, pour aider sort
, que vous souhaitez trier numériquement (option -n
) sur la deuxième colonne (option -k2
).
Mise à jour: Voir le commentaire de Stéphane sur les limitations possibles et sur la façon de s'en débarrasser tr
.
grep -c .
compte les lignes qui contiennent au moins un caractère valide. Utilisez grep -c '^'
pour compter toutes les lignes (comptera également les caractères de fin après la dernière nouvelle ligne avec certaines grep
implémentations). Notez que toutes les grep
implémentations ne prennent pas en charge le -r
comportement a et varie selon les utilisateurs. Vous n'avez pas besoin de traduire :
s (deux points, pas de point-virgule) en espaces pour sort
. Il suffit d'utiliser -t:
. Notez que cela suppose que les noms de fichiers ne contiennent pas de caractères :
vides ou de nouvelle ligne.
wc
donné un total aussi pratique si vous passiez par plusieurs chemins. Coupler cette fonctionnalité avec le joker et le tuyau sort
est vraiment propre.
Avec zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Nous définissons une nouvelle fonction de trilines
qui répond avec le nombre de lignes du fichier. Et nous utilisons le o+lines
qualificatif glob qui, avec n
(pour le tri numérique), définit la manière dont les résultats du glob sont ordonnés. ( .
également ajouté pour vérifier uniquement les fichiers normaux).
Cela ne fait aucune hypothèse sur le caractère que les noms de fichier peuvent contenir, à part les fichiers cachés (ceux commençant par .
) qui sont omis. Ajoutez le D
qualificatif glob si vous le souhaitez également.
bash
seulement ...
Vous ne spécifiez pas si vous voulez également les fichiers dans les sous-répertoires de /group/book/four/word
. La find
solution dans la réponse de jherran descendra dans les sous-répertoires. Si cela n'est pas souhaité, utilisez plutôt le shell:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Si vos noms de fichier peuvent contenir des nouvelles lignes, vous pouvez utiliser quelque chose comme:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Enfin, si vous faites défaut de descendre dans les sous - répertoires, vous pouvez l' utiliser dans bash
4 ou au- dessus:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Notez que les versions de bash
avant 4.3 suivaient les liens symboliques lors récursive en descendant l'arborescence (comme zsh
« s ou tcsh
d » ***/*
).
En outre, toutes les solutions ci-dessus ignoreront les fichiers cachés (ceux dont le nom commence par un .
, utilisez-les shopt -s dotglob
pour les inclure) et incluront également le nombre de lignes de liens symboliques (ce que l' find
approche ne permettra pas).
-xtype f
dans GNU find ou *(-.)
dans zsh) et omettra les fichiers cachés.
%lu
dans printf
? Si je me souviens bien, cela signifie une longue décimale non signée, est-ce vraiment nécessaire? Pourquoi ne pas traiter le nombre comme une chaîne? Est-ce que cela fait une différence?
0
la chaîne sera étendue à la place de la chaîne vide, ce qui est légèrement meilleur. Certaines implémentations de tri fonctionnent avec des entiers non signés, d'autres avec des signatures. %lu
Cela semble être le pari le plus sûr, mais cela n’a probablement pas d’importance, comme si vous aviez des 2^31
lignes, cela prendra de toute façon des siècles.
Si vous voulez installer fd
un outil de recherche de fichiers très rapide écrit en Rust (vous devez l’installer, c’est génial d’avoir de toute façon)
fd --type=file . | xargs wc -l | sort -n
En gros, fd
liste les fichiers, xargs passera la liste des fichiers à wc
(signifie nombre de mots mais passage -l le fera compter les lignes), puis finalement trié du plus petit nombre de lignes à la plus grande sort -n
.
ls -l
ne donne pas le nombre de lignes.ls -lS
trie le fichier par taille avec certainesls
implémentations (la taille étant le nombre d'octets dans le contenu).