L'opzione -U
per ls
non è in POSIX, e in di ls
OS X ha un significato diverso da GNU ls
, che è che rende -t
e -l
tempi di creazione utilizzo al posto di tempi di modifica. -f
è in POSIX come estensione XSI. Il manuale di GNU ls
descrive -f
come do not sort, enable -aU, disable -ls --color
e -U
come do not sort; list entries in directory order
.
POSIX descrive -f
come questo:
Forza ogni argomento per essere interpretato come una directory ed elencare il nome trovato in ogni slot. Questa opzione disattiva -l
, -t
, -s
e -r
e si accende -a
; l'ordine è l'ordine in cui le voci compaiono nella directory.
I comandi come ls|wc -l
danno il risultato errato quando i nomi di file contengono newline.
In zsh si può fare qualcosa di simile:
a=(*(DN));echo ${#a}
D
(glob_dots
) include i file il cui nome inizia con un punto e N
(null_glob
) consente di determinare la si traduca in un errore in una directory vuota .
o lo stesso in bash:
shopt -s dotglob nullglob;a=(*);echo ${#a[@]}
Se IFS
contiene cifre ASCII, aggiungere le virgolette attorno ${#a[@]}
. Aggiungi shopt -u failglob
per assicurarsi che failglob
non sia impostato.
Un'opzione portatile è di utilizzare find
:
find . ! -name . -prune|grep -c/
grep -c /
possono essere sostituiti con wc -l
se i nomi dei file non contengono a capo. ! -name . -prune
è un'alternativa portatile a -mindepth 1 -maxdepth 1
.
O qui è un'altra alternativa che di solito non include i file il cui nome inizia con un punto:
set -- *;[ -e "$1" ]&&echo "$#"
Il comando precedente ha tuttavia include i file il cui nome inizia con un periodo in cui un'opzione come dotglob
in bash o glob_dots
in zsh è impostato. Quando *
non corrisponde a nessun file, il comando genera un errore in zsh con le impostazioni predefinite.
Quale parte su 'ls | wc -l' non è O (1)? – halfdan
ls | wc -l farà sì che ls faccia un opendir(), readdir() e probabilmente una stat() su tutti i file. Questo sarà generalmente almeno O (n). – MarkR
@halfdan: ls emette tutti i file, quindi è O (n) – yassin