Posso determinare il numero di sottodirectory in una directory usando `ls -l`?


8

Quando si visualizzano le directory utilizzando ls -l, il loro numero di collegamenti (il secondo campo nell'output) è almeno due: uno per il nome della directory e uno per.

$ mkdir foo
$ ls -l
total 2
drwxr-xr-x  2 user   wheel  512  4 oct 14:02 foo

È sicuro supporre sempre che il numero di collegamenti sopra 2 corrisponda al numero di sottodirectory in questa directory ( ..collegamenti)?

Risposte:


7

Di solito è vero sui sistemi unix che il numero di collegamenti a una directory è il numero di sottodirectory più 2. Tuttavia ci sono casi in cui ciò non è vero:

  • Alcuni Unix consentono collegamenti rigidi alle directory. Quindi ci saranno più di 2 collegamenti che non corrispondono alle sottodirectory.

  • Esistono file system in cui le directory non hanno voci per .e ... La GNU trovare manuale cita alcuni esempi nella discussione della sua -noleafopzione (che disabilita un'ottimizzazione che presuppone che .e ..esistono in tutte le directory): “file system CD-ROM o MS-DOS o di montaggio del volume AFS punti”

Un modo quasi affidabile per contare il numero di sottodirectory (potrebbe comunque non riuscire se un nome file contiene un carattere di nuova riga) è

$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)

Un modo più affidabile utilizza globs shell */e .*/; come al solito gestire il caso in cui il modello non corrisponde è un po 'una seccatura (tranne in bash e zsh dove è possibile attivare l' nullglobopzione).


2

Ecco un altro modo per contare le sottodirectory (in modo non ricorsivo) in Bash:

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

Poiché ogni nome di file viene terminato da un carattere ASCII NUL, questo dovrebbe funzionare correttamente anche se un nome di file contiene un carattere di nuova riga.



1

Non riesco a trovare nulla nella documentazione che confermi che il numero di collegamenti sarà sempre +2 sul numero di sottodirectory.

Ma, per trovare la quantità corretta, utilizzare:

find . -type d -mindepth 1  -maxdepth 1 | wc -l

O se devi usare ls -l, vedi l'altra risposta.


Penso che volevi dire -type d, ma: 1. questo richiede GNU find; 2. è necessario sottrarre 1 per la directory di partenza (o passare -mindepth 1).
Gilles 'SO- smetti di essere malvagio' il

0

Non usare lsper questo . Ecco un modo che funziona con tutti i nomi di file, anche quelli contenenti nuove righe, perché stampa solo un carattere di nuova riga anziché il nome file:

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

Modifica: la versione corrente non genera alcun avviso, perché -mindepthe -maxdepthdovrebbe essere precedente -type(l'albero delle directory viene eliminato prima di controllare le directory, per risparmiare tempo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.