Jeśli parsowanie danych wyjściowych ls
jest niebezpieczne, ponieważ może uszkodzić niektóre funky (spacje \n
, ...), jaki jest najlepszy sposób, aby poznać liczbę plików w katalogu?
Zwykle polegam na find
unikaniu tego analizowania, ale podobnie find mydir | wc -l
zepsuje się z tych samych powodów.
Obecnie pracuję nad systemem Solaris, ale szukam odpowiedzi tak przenośnej dla różnych jednorożców i różnych powłok.
find
dostanie ci rekursywnie liczbę plików (użyj,-maxdepth 1
jeśli tego nie chcesz.find mydir -maxdepth 1 -type f -printf \\n | wc -l
powinien obsługiwać znaki specjalne w nazwie pliku, ponieważ nigdy nie są drukowane w pierwszej kolejnościOdpowiedzi:
Co powiesz na tę sztuczkę?
Tak przenośny jak
find
iwc
.źródło
n+1
pliki w moim systemie Debian). Nie filtruje również zwykłych plików.find
polecenia do konkretnych potrzeb. Tak, ten zawiera wszystkie katalogi, w tym.
(co może być powodem, dla którego widzisz wynik jakon+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; niektóre starsze wersjefind
nie mają-not
.-maxdepth
nie jest to standard (rozszerzenie GNU jest teraz obsługiwane również przez kilka innych implementacji).Z bash, bez zewnętrznych narzędzi i pętli:
W ksh zamień
shopt -s dotglob
naFIGNORE=.?(.)
. W Zsh zastąp gosetopt glob_dots
lub usuńshopt
połączenie i użyjfiles=(*(D))
. (Lub po prostu upuść linię, jeśli nie chcesz dołączać plików kropek.) Przenośnie, jeśli nie obchodzi Cię pliki kropek:Jeśli chcesz dołączyć pliki kropek:
źródło
1
dla pustego katalogu, gdynullglob
nie jest włączony. W zsh,a=(*(DN));echo ${#a}
zN
(nullglob
) kwalifikator nie powoduje błędu do pustego katalogu.Powinien być dość przenośny na systemy po latach 80.
Dotyczy to wszystkich pozycji katalogu oprócz
.
i..
w bieżącym katalogu.Aby policzyć pliki również w podkatalogach:
(ten powinien być przenośny nawet na Unix V6 (1975), ponieważ nie potrzebuje
-prune
)źródło
find dirname ! -name dirname -prune -print
). I od tego czasu zastanawiałem się, czy jest jakiś szczególny powód, aby używaćgrep -c /
zamiastwc -l
(co jest prawdopodobnie bardziej powszechnie stosowane do liczenia).find dirname ! -name dirname
nie działa, jeśli istnieją inne katalogi, które są nazwanedirname
. Lepiej jest użyćfind dirname/. ! -name .
.wc -l
zlicza liczbę wierszy, nazwy plików mogą składać się z kilku wierszy, ponieważ znak nowej linii jest tak samo ważny jak dowolny w nazwie pliku.Próbować:
-b
Będą miały znaki niedrukowalne,-A
pokaże wszystkie pliki z wyjątkiem.
i..
jeden na linię (domyślnie na rurze, ale dobre być jawne).Tak długo, jak uwzględniamy języki skryptowe wyższego poziomu, tutaj jest jeden wiersz w Pythonie:
Lub z pełnym „znajdź”:
źródło
Yoc może korzystać z takiej konstrukcji:
Ale obawiam się, że możesz zlikwidować błąd, tak
Argument list too long.
jakbyś miał zbyt wiele plików w katalogu. Jednak przetestowałem go na katalogu z 10 miliardami plików i działał dobrze.źródło
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Czy zastanawiałeś się nad perlem, który powinien być względnie przenośny?
Coś jak:
źródło
Spróbuj tego => Używanie ls z -i (dla numeru węzła) i -F (dołącza nazwę katalogu z opcjami „/”).
źródło
Z
perl
jednowarstwowym (sformatowanym dla czytelności):lub
Możesz używać
perl
funkcji modyfikujących tablice, takich jakgrep
lubmap
w drugiej wersji. Zobaczperldoc -f readdir
przykład użyciagrep
.źródło
Najprostsza wersja, z której korzystam cały czas i z którą nigdy nie miałem problemów to:
ls -b1 | wc -l
źródło
\n
znaki funky lub inne (tak, niektóre unikaty na to pozwalają).Oprócz opartej na
find
odpowiedzi odpowiedzi zaproponowanej przez Stéphane , oto odpowiedź zgodna z POSIX na podstawiels
:źródło