Mam katalog z dużą liczbą plików. Nie widzę ls
przełącznika do podania liczby. Czy jest jakaś magia z wiersza poleceń, aby uzyskać liczbę plików?
command-line
Blake
źródło
źródło
tree . | tail
lubtree -a . | tail
dołączanie ukrytych plików / katalogów,tree
jest rekurencyjne, jeśli tego właśnie chcesz.Odpowiedzi:
Korzystanie z szerokiej definicji „pliku”
(zwróć uwagę, że nie uwzględnia ukrytych plików i zakłada, że nazwy plików nie zawierają znaków nowej linii).
Aby dołączyć ukryte pliki (oprócz
.
i..
) i uniknąć problemów ze znakami nowej linii, kanoniczny sposób to:Lub rekurencyjnie:
źródło
wc
to program do „liczenia słów”.-l
Przełącznik powoduje je policzyć wiersze. W tym przypadku zlicza linie na wyjściu zls
. W ten sposób zawsze uczono mnie, jak uzyskać liczbę plików dla danego katalogu.ls
tak jest,ls -1
jeśli wyjście jest potokiem.ls -la
, otrzymasz trzy linie do książki telefonicznej. Chceszls -lA | wc -l
pominąć wpisy.
i..
. Nadal będziesz jednak traktowany osobno.ls -q | wc -l
- chociaż zauważ, że ukryte pliki nadal nie będą liczone przez to podejście i że katalogi zostaną policzone.W przypadku wąskiej definicji pliku:
źródło
-maxdepth 1
rekurencyjne zliczanie plików (lub dostosować je do żądanej maksymalnej głębokości wyszukiwania).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: Uwaga ls - <numer-one> | wc - <letter-l>
źródło
ls
zrobić-1
automatycznie, gdy wyjście jest w rurze.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Prawdopodobnie najbardziej kompletna odpowiedź przy użyciu
ls
/wc
pair jestjeśli chcesz policzyć pliki kropkowe, i
Inaczej.
-A
to zliczać pliki kropkowe, ale pomijaj.
i..
.-q
makels
zamień znaki niebędące znakami graficznymi, w szczególności znak nowej linii?
, tworząc wynik 1 linię dla każdego plikuAby uzyskać wyjście jednowierszowe z
ls
terminala (tj. Bez podłączania do niegowc
),-1
należy dodać opcję.(zachowanie
ls
testowane z Coreutils 8.23)źródło
-1
nie jest potrzebne. Jeśli chodzi o „rozsądnie obsługuje nowe wiersze w nazwach plików z wyjściem konsoli” , dzieje się tak z powodu-q
przełącznika (którego należy użyć zamiast,-b
ponieważ jest przenośny), który „Wymusza zapisanie każdego wystąpienia niedrukowalnych znaków nazw plików i znaków <tab> jako znak <znak zapytania> („?”). Implementacje mogą domyślnie udostępniać tę opcję, jeśli dane wyjściowe dotyczą urządzenia końcowego. ” Na przykład,ls -Aq | wc -l
aby policzyć wszystkie pliki / katalogi lubls -qp | grep -c /
policzyć tylko-b
na-q
.Jeśli wiesz, że bieżący katalog zawiera co najmniej jeden nie ukryty plik:
Można to oczywiście uogólnić na dowolny glob.
W skrypcie ma to czasami niefortunny efekt uboczny nadpisania parametrów pozycyjnych. Można obejść ten problem, używając podpowłoki lub funkcji (wersja Bourne / POSIX), takiej jak:
Alternatywnym rozwiązaniem jest
$(ls -d -- * | wc -l)
. Jeśli glob jest*
, polecenie można skrócić$(ls | wc -l)
. Analiza wynikuls
zawsze powoduje, że jestem niespokojny, ale tutaj powinien on działać tak długo, jak długo twoje nazwy plików nie zawierają znaków nowej linii, lub twoje znakils
ucieczki. I$(ls -d -- * 2>/dev/null | wc -l)
ma tę zaletę, że z wdziękiem obsługuje przypadek niepasującego globu (tzn. Zwraca 0 w tym przypadku, podczas gdyset *
metoda wymaga skomplikowanego testowania, czy glob może być pusty).Jeśli nazwy plików mogą zawierać znaki nowego wiersza, można zastosować alternatywę
$(ls -d ./* | grep -c /)
.Każde z tych rozwiązań, które opiera się na przekazaniu rozszerzenia globu,
ls
może zawieść z powodu zbyt długiego błędu listy argumentów, jeśli istnieje wiele pasujących plików.źródło
local
lub ją wyeliminować:eval $1=$#
lub po prostu użyćecho $#
i zrobićnumber_of_files=$(count_words *)
.$#
(nie zrobiłeś tego przed edycją)?$1
. Chcę więc policzyć liczbę parametrów, które nie są pierwszym parametrem. (Nie mogę użyć,shift
ponieważ muszę zachować nazwę zmiennej w pobliżu.) (Umm, teraz, gdybyś zapytał o pierwszą linię ...)shift
jeśli dobrze to zaplanuję .Uznałem, że jest
du --inodes
przydatny, ale nie jestem pewien, która wersjadu
tego wymaga. Powinno być znacznie szybsze niż podejście alternatywne z wykorzystaniemfind
iwc
.W systemie Ubuntu 17.10 działa:
Połącz z,
| sort -nr
aby posortować malejąco według liczby zawierających i-węzłów.źródło
Podczas korzystania z pary ls / wc, jeśli dodajemy -U, będzie to znacznie szybsze (nie sortuj).
źródło
-U
jest jednak specyficzny dla GNU.Po zainstalowaniu polecenia drzewa wpisz:
tree
Jeśli chcesz też ukrytych plików:
tree -a
Jeśli używasz systemu Debian / Mint / Ubuntu Linux, wpisz następujące polecenie, aby zainstalować polecenie drzewa:
sudo apt-get install tree
Opcja -L służy do określania maksymalnego poziomu wyświetlania drzewa katalogów. Polecenie tree nie tylko liczy liczbę plików, ale także liczbę katalogów, biorąc pod uwagę tyle poziomów drzewa katalogów, ile chcesz.
źródło
-maxdepth 1
sprawi, że będzie nierekurencyjny,find
domyślnie będzie rekurencyjny-type f
będzie zawierać tylko pliki-printf .
to uroczy akcent. wypisuje kropkę dla każdego pliku zamiast nazwy pliku, a teraz jest w stanie obsłużyć dowolną nazwę pliku, a także zapisuje dane; musimy tylko policzyć kropki :)| wc -c
liczy znakiźródło
Bez rury, bez kopii struny, bez widelca, po prostu zwykłe uderzenie jednej wkładki
źródło
Oto kolejna technika podobna do tej, którą napisał Gilles :
co tworzy tablicę z 13,923 elementami (jeśli tyle jest plików).
źródło
c
tablicy?word_count() { echo "$#"; }
powinno wystarczyć. Celem rozwiązania @Gilles jest przechowywanie liczby w zwracanej zmiennej, aby uniknąć konieczności zastępowania poleceń (co obejmuje rozwidlenie i potok w powłokach innych niż ksh93).Może to zawierać tylko pliki w bieżącym katalogu.
źródło
find . -type f
znajdzie pliki w bieżącym katalogu, a także rekurencyjnie w podkatalogach.Spróbuj tego, mam nadzieję, że ta odpowiedź ci pomoże
źródło
Możesz to sprawdzić za pomocą:
źródło
Poprawianie niektórych odpowiedzi udzielonych wcześniej, ale tym razem wyraźnie.
Warto zauważyć użycie niektórych ulubionych poleceń, takich jak
tail
icut
. Pamiętaj też, że drzewo nie jest domyślnie dostępne. Polecenie powyżej najpierw przechwytuje informacje o katalogu na poziomie 1, a następnie pobiera ostatni wiersz, wtail -n 1
którym jest nasz cel, i kończy sięcut
na wzięciu trzeciego słowa.Na przykład lokalizowanie w
/
:Co powiesz na pytanie o liczbę katalogów?
źródło
W systemie Linux, aby polecenie było bardzo niezawodne i obsługiwało pliki, które mogą mieć w nazwie znaki nowej linii, użyj tego:
To nas ratuje przed próbą przetworzenia
ls
.Związane z:
źródło
Użyj
tree
polecenia, po prostu:źródło