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
, pwd
e 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 bin
e sbin
ciascuno ha due collegamenti ad esso. Uno è la voce della directory nella directory principale e l'altra è la .
voce all'interno di quella directory.
Usare ls
con 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 -1
dell'opzione per attivare esplicitamente il comportamento. wc -l
conta 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' -b
opzione ls per evitarli. ls -1bA
stamperà 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 -l
per una riga di comando completa ls -1bA | wc -l
che riporterà il numero di file e directory nella directory corrente (ma ignora .
e ..
; questa è la differenza tra -a
e -A
), ma non scende in nessuna sottodirectory. Se non si desidera conteggiare alcun dotfile per il totale, è sufficiente omettere il -A
parametro ls
.