Ogni directory su un sistema Unix (e probabilmente anche ogni altro sistema) contiene almeno due voci di directory. Questi sono .(directory corrente) e ..(directory principale). Nel caso della directory principale, questi puntano nella stessa posizione, ma con qualsiasi altra directory, sono diversi. Puoi vederlo da solo usando i comandi stat, pwde cd(su Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Si noti che bine sbinciascuno ha due collegamenti ad esso. Uno è la voce della directory nella directory principale e l'altra è la .voce all'interno di quella directory.
Usare lscon una pipe per wc -lè un semplice trucco per contare il numero di righe nell'output di ls. Il presupposto è che ogni file o directory occuperà esattamente una riga nell'output. GNU, quando l'uscita non è un terminale, lo farà automaticamente; altri potrebbero aver bisogno -1dell'opzione per attivare esplicitamente il comportamento. wc -lconta e genera semplicemente il numero di righe ( -l) nel suo input.
Il problema con questo approccio è che in Linux e sui file system tradizionalmente usati su Linux, i nomi di file e directory (in realtà sono la stessa cosa in questo senso) possono contenere caratteri di nuova riga . In presenza di questi, uno dei due metodi cade a pezzi: quelle voci verranno conteggiate come due o più voci quando in realtà sono una sola.
Finché stai usando GNU ls, non hai voci di directory con nomi contenenti caratteri di nuova riga e non hai alias dispari per ls(ad esempio ls -a), entrambi genereranno il conteggio di file e directory nella directory corrente (o specificata). Per la maggior parte delle persone, questo è abbastanza buono, ma non è valido nel caso generale .
Se hai bisogno di gestire correttamente caratteri insoliti (principalmente newline) nei nomi delle voci della directory, ti suggerisco di usare l' -bopzione ls per evitarli. ls -1bAstamperà il nome di ogni voce della directory sulla propria riga, sfuggirà a caratteri insoliti (quindi ogni voce della directory sarà vista come una), inclusi tutti i dotfile e -directory. Mettiti alla prova wc -lper una riga di comando completa ls -1bA | wc -lche riporterà il numero di file e directory nella directory corrente (ma ignora .e ..; questa è la differenza tra -ae -A), ma non scende in nessuna sottodirectory. Se non si desidera conteggiare alcun dotfile per il totale, è sufficiente omettere il -Aparametro ls.