Risposte:
Dovresti usare un comando come questo:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: cerca i file sul percorso desiderato. Se non lo si desidera ricorsivo e l' find
implementazione lo supporta, è necessario aggiungere -maxdepth 1
poco prima -exec
dell'opzione.exec
: dice al comando di eseguire wc -l
su ogni file.sort -rn
: ordina i risultati numericamente in ordine inverso. Dal più grande al più basso.(ciò presuppone che i nomi dei file non contengano caratteri di nuova riga).
wc
verrà anche stampata una total
riga, quindi qui otterrai anche una o più righe "totali" a meno che non ci sia un solo file . È possibile reindirizzare a grep /
per rimuoverli.
sort
comando
Probabilmente la versione più semplice se non hai bisogno di ricorsività:
wc -l /group/book/four/word/*|sort -n
wc
conta le righe (opzione -l
) in ogni file (ma nascosto) ( *
) sotto /group/book/four/word/
e sort
ordina |
numericamente il risultato (attraverso la pipe )-n
) ).
Qualcuno ha fatto un commento a questa risposta menzionando grep -rlc
, prima di sopprimerla. Infatti grep
è un'ottima alternativa, soprattutto se hai bisogno di ricorsività:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
conterà (opzione -c
) in modo ricorsivo (opzione -r
) le righe corrispondenti ( grep
) '^'
(ovvero l'inizio delle righe) nella directory /group/book/four/word/
. Quindi devi sostituire i due punti con uno spazio, ad esempio usando tr
, per aiutare sort
, che vuoi ordinare numericamente (opzione -n
) sulla seconda colonna (opzione-k2
).
Aggiornamento: vedi il commento di Stephane sulle possibili limitazioni e su come puoi effettivamente sbarazzartene tr
.
grep -c .
conta le righe che contengono almeno un carattere valido. Usa grep -c '^'
per contare tutte le linee (conterà anche alcune lettere finali dopo l'ultima nuova riga con alcune grep
implementazioni). Si noti che non tutte le grep
implementazioni supportano -r
ae il comportamento varia tra quelli che lo fanno. Non è necessario tradurre :
s (due punti, non punto e virgola) in spazi per sort
. Basta usare -t:
. Si noti che ciò presuppone che i nomi dei file non contengano :
caratteri vuoti o di nuova riga.
wc
dato un totale così utile se passi più percorsi. Accoppiare quella funzionalità con il jolly e il pipe sort
è davvero pulito.
Con zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Definiamo una nuova funzione di ordinamentolines
che risponde con il numero di righe nel file. E usiamo il o+lines
qualificatore glob che insieme a n
(per ordinamento numerico), definisce come sono ordinati i risultati del glob. (.
aggiunto anche per controllare solo i file normali).
Ciò non presuppone quale carattere i nomi dei file possano contenere diversi dai file nascosti (quelli che iniziano con .
) sono omessi. Aggiungi il D
qualificatore glob se vuoi anche loro.
bash
solo ...
Non specifichi se desideri anche i file in alcuna sottodirectory di /group/book/four/word
. La find
soluzione nella risposta di jherran scenderà nelle sottodirectory. Se ciò non è desiderato, utilizzare invece la shell:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Se i nomi dei tuoi file possono contenere newline, puoi usare qualcosa come:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Infine, se si fa voglia di scendere in sottodirectory, è possibile utilizzare questo in bash
4 o superiore:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Si noti che le versioni bash
precedenti alla 4.3 seguivano i collegamenti simbolici quando si discendeva ricorsivamente dall'albero delle directory (come zsh
"o tcsh
"***/*
).
Inoltre, tutte le soluzioni sopra ignoreranno i file nascosti (quelli il cui nome inizia con a .
, li usano shopt -s dotglob
per includerli) e includeranno anche il conteggio delle linee di collegamenti simbolici (che l' find
approccio non prevede).
-xtype f
in GNU find o *(-.)
in zsh) e ometterà i file nascosti.
%lu
in in printf
? Ricordo che ciò significa decimali lunghi senza segno, è davvero necessario? Perché non trattare il numero come una stringa? Fa la differenza?
0
invece della stringa vuota, il che è leggermente migliore. Alcune implementazioni di ordinamento funzionano con numeri interi senza segno, altri con segno. %lu
suona come la scommessa più sicura, ma probabilmente non importa come se avessi delle 2^31
linee, che comunque richiederà secoli.
Se vuoi installare fd
un cercatore di file molto veloce scritto in Rust (dovresti installarlo, è bello averlo comunque)
fd --type=file . | xargs wc -l | sort -n
Fondamentalmente fd
elenca i file, xargs passerà l'elenco dei file a wc
(sta per conteggio delle parole ma passando -l lo farà contare le righe) quindi alla fine viene ordinato dal minimo numero di righe al massimo utilizzo sort -n
.
ls -l
non fornisce il numero di righe.ls -lS
ordina i file per dimensione con alcunels
implementazioni (la dimensione è il numero di byte nel contenuto).