Mylisz łamany pasek ¦(ASCII 166) z pionowym paskiem |(ASCII 124) używanym dla potoku UNIX .
Skippy le Grand Gourou
7
@SkippyleGrandGourou Czy to się nie nazywa fajka?
DaveStephens
27
@DaveStephens Tak, to się nazywa tak. Nazywa się to również pociągnięciem Sheffera, pionowym paskiem, vbar, drążkiem, pionową linią, pionowym cięciem, prętem, obeliskiem, poślizgiem.
emlai
64
@zenith Nazywam to po prostu Bob.
Christopher
15
W RFC20 nazywa się to „linią pionową”. „Rura” to nazwa operatora powłoki, a nie nazwa symbolu. Podobnie jak *„gwiazdka” ASCII, ale „razy” w niektórych innych kontekstach.
szczupły
Odpowiedzi:
1325
To powinno działać:
find DIR_NAME -type f | wc -l
Wyjaśnienie:
-type f zawierać tylko pliki.
|( i nie¦ ) przekierowuje findstandardowe wyjście wcpolecenia na standardowe wejście polecenia.
wc(skrót od liczby słów) zlicza nowe wiersze, słowa i bajty na wejściu ( docs ).
-l policzyć tylko nowe linie.
Uwagi:
Wymień DIR_NAMEsię ., aby wykonać polecenie w bieżącym folderze.
Możesz również usunąć, -type faby uwzględnić katalogi (i dowiązania symboliczne) w liczeniu.
Możliwe, że to polecenie zostanie przeliczone, jeśli nazwy plików mogą zawierać znaki nowej linii.
Wyjaśnienie, dlaczego twój przykład nie działa:
W poleceniu, które pokazałeś, nie używasz „Pipe” ( |) do łączenia dwóch poleceń, ale zepsuty pasek ( ¦), którego powłoka nie rozpoznaje jako polecenia lub czegoś podobnego. Dlatego pojawia się ten komunikat o błędzie.
Korzystanie findz pętli zewnętrznej jest po prostu niepotrzebną komplikacją. for i in */; do`
tripleee
funkcja countit {dla i w $ (find. -maxdepth 1 -type d); do file_count = $ (znajdź $ i -type f | wc -l); echo "$ file_count: $ i"; gotowy }; countit | sort -n -r
Schneems,
Wreszcie tego potrzebowałem. Moje foldery mają tysiące plików, więc drukowanie ich z drzewa lub czegokolwiek innego nie wchodzi w grę
lesolorzanov
Obejmuje to ../ i nie wydaje się iść naprzód - co oznacza, że nie jest regresywne.
Daniel Lefebvre
50
Możesz użyć
$ tree
po zainstalowaniu pakietu drzewa za pomocą
$ sudo apt-get install tree
(na komputerze z systemem Linux Debian / Mint / Ubuntu).
Polecenie pokazuje osobno nie tylko liczbę plików, ale także liczbę katalogów. Opcji -L można użyć do określenia maksymalnego poziomu wyświetlania (który domyślnie jest maksymalną głębokością drzewa katalogów).
Ukryte pliki można również dołączyć, podając -aopcję.
Jest to w rzeczywistości najprostszy sposób na sprawdzenie liczby katalogów i plików.
Lorem Ipsum Dolor
11
Ze strony podręcznika: Domyślnie drzewo nie drukuje ukrytych plików . Musisz podać -aopcję ich włączenia.
eee
3
Aby zainstalować to w systemie macOS, użyj brewi uruchom brew install tree, najlepiej po uruchomieniu brew update.
Ashish Ahuja,
4
Drukuje również wszystkie nazwy plików, więc będzie wolno, jeśli masz wiele plików.
Franck Dernoncourt
2
Wow, bardzo ładne narzędzie, może drukować foldery pokolorowane, wyświetlać tylko foldery, wyświetlać jako JSON. Może wyświetlić listę 34 000 folderów i 51 000 plików w ciągu kilku sekund. Olé!
brasofilo,
46
Na moim komputerze rsyncjest trochę szybszy niż find | wc -lw zaakceptowanej odpowiedzi:
$ rsync --stats --dry-run -ax /path/to/dir /tmp
Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes
Drugi wiersz ma liczbę plików, 150,481 w powyższym przykładzie. Jako bonus otrzymasz także całkowity rozmiar (w bajtach).
Uwagi:
pierwszy wiersz to liczba plików, katalogów, dowiązań symbolicznych itp., dlatego jest większy niż drugi wiersz.
--dry-run(lub -nopcja w skrócie) jest ważne, aby nie faktycznie przenieść pliki!
Użyłem -xopcji „nie przekraczaj granic systemu plików”, co oznacza, że jeśli ją /wykonasz i masz podłączone zewnętrzne dyski twarde, to policzy tylko pliki na partycji głównej.
Podoba mi się twój pomysł użycia rsync tutaj. Nigdy bym o tym nie pomyślał!
Qeole,
Dzięki @Qeole, pomysł nie jest mój. Przeczytałem go kilka lat temu, że rsync jest najszybszym narzędziem do usuwania folderu z dużą ilością plików i podfolderów, więc pomyślałem, że szybkie może być również zliczanie plików.
psmith
1
Próbowałem tego. Po dwukrotnym uruchomieniu obu stron w celu zapełnienia pamięci podręcznej fs, find ~ -type f | wc -lzajęło 1,7 / 0,5 / 1,33 sekundy (real / user / sys). rsync --stats --dry-run -ax ~ /xxxzajęło 4,4 / 3,1 / 2,1 sekundy. To dotyczy około 500 000 plików na dysku SSD.
szczupły
Nie wiem, jakiej wersji rsync użyłeś, ale w 3.1.2 trochę łatwiej jest przeczytać:Number of files: 487 (reg: 295, dir: 192)
mpen
Użyłem domyślnego rsync na macOS:rsync version 2.6.9 protocol version 29
psmith
20
Ponieważ nazwy plików w systemie UNIX mogą zawierać znaki nowej linii (tak, nowe linie), wc -lmogą liczyć zbyt wiele plików. Wydrukowałbym kropkę dla każdego pliku, a następnie policzyłem kropki:
Wygląda na to, że jest to jedyne rozwiązanie, które obsługuje pliki z nazwami nowej linii. Pozytywne.
codeforester,
2
hihi :) Uwielbiam znaki nowej linii w nazwach plików. To sprawia, że są po prostu bardziej czytelne.
hek2mgl,
Znaczy nowe wiersze w nazwach plików, a nie w treści!
codeforester,
1
Tylko żartowałem ... Tak, zawsze trzeba brać pod uwagę nowe wiersze w nazwach plików. Mogą pochodzić ze złośliwych treści lub mniej spektakularnych, z literówki.
hek2mgl
18
Łącząc kilka odpowiedzi tutaj razem, najbardziej użytecznym rozwiązaniem wydaje się być:
Może obsługiwać dziwne rzeczy, takie jak nazwy plików, które zawierają nawiasy spacji, a nawet nowe linie. Sortuje również dane wyjściowe według liczby plików.
Możesz zwiększyć liczbę po, -maxdepthaby policzyć również podkatalogi. Pamiętaj, że może to potencjalnie zająć dużo czasu, szczególnie jeśli masz mocno zagnieżdżoną strukturę katalogów w połączeniu z dużą -maxdepthliczbą.
Co oznacza echo -e? Wydaje mi się, że umieścisz go, by spasować dowolne znaki nowej linii, ale będzie to również zniekształcać każdą inną nieregularną białą spację i spróbuje rozwinąć dowolne znaki zastępcze obecne dosłownie w nazwach plików. Po prostu wybrałbym coś podobnego find .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'i żyłbym z wszelkimi aberracjami w danych wyjściowych, a może bawiłem się Bash'em printf "%q"do drukowania nazwy katalogu.
tripleee
10
Jeśli chcesz wiedzieć, ile plików i podkatalogów istnieje z bieżącego katalogu roboczego, możesz użyć tego jednowierszowego
Doskonałe rozwiązanie! Jedyny problem, jaki znalazłem, to katalogi ze spacjami lub znaki specjalne. Dodaj cytaty, w których używana jest nazwa katalogu:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
John Kary
1
Trochę go zmodyfikowałem i działa całkiem dobrze:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek
Obowiązują tu także moje komentarze do odpowiedzi @ Sebastiana. Użycie echo -e(lub po prostu „echo” jak w poprzednim komentarzu) w niecytowanej nazwie katalogu powoduje zamianę jednego problemu na drugi.
tripleee
8
Jeśli chcesz uniknąć przypadków błędów, nie zezwalaj wc -lna wyświetlanie plików z nowymi liniami (które będą liczone jako 2+ plików)
np. rozważmy przypadek, w którym mamy jeden plik z jednym znakiem EOL
> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2
Ponieważ przynajmniej gnu wcwydaje się nie mieć opcji odczytu / zliczenia listy zakończonej zerem (oprócz pliku), najłatwiejszym rozwiązaniem byłoby po prostu nie przekazywanie jej nazw plików, ale statyczne wyjście za każdym razem, gdy plik zostanie znaleziony, np. w tym samym katalogu co powyżej
To głównie oblicza użycie dysku, a nie liczbę plików. Ten dodatkowy narzut prawdopodobnie nie jest pożądany. (oprócz potrzeby instalowania dodatkowego pakietu do czegoś, co można zrobić za pomocą standardowych narzędzi POSIX)
hek2mgl
@ hek2mgl Oblicza liczbę plików, jak pokazano na czerwono na pierwszym zrzucie ekranu. Zajęło mi kilka minut na ~ 2 miliony plików, więc prędkość nie jest taka zła.
Franck Dernoncourt
2
@ hek2mgl W odpowiedzi dodałem powtarzalny test porównawczy, uruchomiłem go dwa razy i nie zauważyłem żadnej różnicy między find . -type f | wc -l i ncdu.
Franck Dernoncourt
2
tak, wygląda na findto , że pod maską wykonuje mniej więcej takie same wywołania systemowe, jak dla duktórych jest backend ncdu. Właśnie ich straciłem.
hek2mgl
1
@FranckDernoncourt uwielbiał to. Mam mnóstwo plików w folderze i posiadanie paska postępu oszczędza życie. Dzięki za udostępnienie!
Aby ustalić, ile plików znajduje się w bieżącym katalogu, włóż ls -1 | wc -l. To służy wcdo zliczenia liczby linii (-l)na wyjściu ls -1. Nie liczy plików dotfiles. Proszę to zanotowaćls -l (to jest „L” zamiast „1” jak w poprzednich przykładach), których użyłem w poprzednich wersjach tego HOWTO, faktycznie da ci liczbę plików o jeden większą niż faktyczna liczba. Dzięki Kam Nejad za ten punkt.
Jeśli chcesz liczyć tylko pliki i NIE zawierasz dowiązań symbolicznych (tylko przykład tego, co jeszcze możesz zrobić), możesz użyć ls -l | grep -v ^l | wc -l(to tym razem „L”, a nie „1”, chcemy tutaj „długiej” listy) . grepsprawdza każdą linię zaczynającą się na „l” (wskazującą łącze) i odrzuca tę linię (-v).
Szybkość względna: „ls -1 / usr / bin / | wc -l” zajmuje około 1,03 sekundy na nieobciążonym 486SX25 (/ usr / bin / na tym komputerze ma 355 plików). „ ls -l /usr/bin/ | grep -v ^l | wc -l” zajmuje około 1,19 sekundy.
ls -lmusi wykonać statsyscall na każdym pliku, aby odczytać jego rozmiar, mtime i inne właściwości, co jest wolne. W dużych katalogach (ponad 100 000 plików) uruchomienie ls -lmoże potrwać kilka minut. Aby liczyć tylko pliki, zawsze używaj ls -1 | wc -l.
Marki555,
A 486SX25, ładne
cam8001
ls -1wciąż może być powolny w dużych katalogach, ponieważ musi sortować pliki. Po prostu printf '%s\n' *robi to samo i unika zewnętrznego lspołączenia (które i tak jest problematyczne ), ale najskuteczniejszym rozwiązaniem jest użycie polecenia, które nie wykonuje żadnego sortowania, takiego jak find. (Globalny wynik jest sortowany według powłoki.)
tripleee
4
Jeśli potrzebujesz rekurencyjnie policzyć określony typ pliku , możesz:
find YOUR_PATH -name '*.html'-type f | wc -l
-l służy tylko do wyświetlenia liczby linii na wyjściu.
Rozszerzenie jest częścią nazwy pliku i może nie reprezentować pliku TYPE
Waxhead
4
Z uderzeniem:
Utwórz tablicę wpisów za pomocą () i uzyskaj liczbę za pomocą #.
FILES=(./*); echo ${#FILES[@]}
Ok, nie rekurencyjnie liczę plików, ale najpierw chciałem pokazać prostą opcję. Typowym przypadkiem użycia może być tworzenie kopii zapasowych najazdu pliku. Spowoduje to utworzenie logfile.1, logfile.2, logfile.3 itd.
CNT=(./logfile*); mv logfile logfile.${#CNT[@]}
Liczba rekurencyjna przy globstarwłączonej wersji bash 4+ (jak wspomniano w @tripleee)
FILES=(**/*); echo ${#FILES[@]}
Aby rekurencyjnie uzyskać liczbę plików, nadal możemy używać find w ten sam sposób.
Nowoczesne powłoki obsługują **/*wyliczanie rekurencyjne. Jest to nadal mniej wydajne niż findw przypadku dużych katalogów, ponieważ powłoka musi sortować pliki w każdym katalogu.
tripleee
2
W przypadku katalogów ze spacjami w nazwie ... (na podstawie różnych odpowiedzi powyżej) - rekurencyjnie wypisz nazwę katalogu z liczbą plików w:
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
Przykład (sformatowany dla czytelności):
pwd
/mnt/Vancouver/Programming/scripts/claws/corpus
ls -l
total 8
drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'
ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
138
## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
29
Struktura katalogów jest lepiej wizualizowana za pomocą tree:
tree -L 3 -F .
.
├── Catabolism - Autophagy; Phagosomes; Mitophagy/
│ ├── 1
│ ├── 10
│ ├── [ ... SNIP! (138 files, total) ... ]
│ ├── 98
│ └── 99
└── Catabolism - Lysosomes/
├── 1
├── 10
├── [ ... SNIP! (28 files, total) ... ]
├── 8
├── 9
└── aaa/
└── bbb
3 directories, 167 files
man find | grep mindep
-mindepth levels
Do not apply any tests or actions at levels less than levels
(a non-negative integer). -mindepth 1 means process all files
except the starting-points.
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1
Zastosowanie: Chcę znaleźć maksymalną liczbę plików spośród kilkuset katalogów (cała głębokość = 1) [dane wyjściowe ponownie sformatowane dla czytelności]:
sort -Vjest rodzajem naturalnym. ... Tak więc moja maksymalna liczba plików w dowolnym z tych katalogów (Claws Mail) to 4375 plików. Jeśli zostawię lewy pad ( https://stackoverflow.com/a/55409116/1904943 ) te nazwy plików - wszystkie są nazwane numerycznie, zaczynając od 1, w każdym katalogu - i pad do 5 cyfr łącznie, powinienem być w porządku .
Uzupełnienie
Znajdź całkowitą liczbę plików, podkatalogów w katalogu.
$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS
$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News
Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine
$ find . -type f | wc -l
70214 ## files
$ find . -type d | wc -l
417 ## subdirectories
Napisałem ffcnt aby przyspieszyć liczenie plików rekurencyjnych w określonych okolicznościach: dyski obrotowe i systemy plików, które obsługują mapowanie zasięgu.
Może to być rząd wielkości szybszy niż lslub findpodejście oparte, ale YMMV.
Po pierwsze, to nie odpowiada na pytanie. Pytanie dotyczy rekurencyjnego zliczania plików z katalogu do przodu, a wyświetlane polecenie tego nie robi. ponadto, z ls liczysz katalogi oraz pliki. Ponadto nie ma powodu, aby odpowiadać na stare pytanie, jeśli nie zamierzasz dodawać niczego nowego i nawet nie przeczytasz pytania poprawnie. Powstrzymaj się od tego.
XFCC,
-1
To alternatywne podejście z filtrowaniem formatu liczy wszystkie dostępne moduły jądra grub:
¦
(ASCII 166) z pionowym paskiem|
(ASCII 124) używanym dla potoku UNIX .*
„gwiazdka” ASCII, ale „razy” w niektórych innych kontekstach.Odpowiedzi:
To powinno działać:
Wyjaśnienie:
-type f
zawierać tylko pliki.|
( i nie¦
) przekierowujefind
standardowe wyjściewc
polecenia na standardowe wejście polecenia.wc
(skrót od liczby słów) zlicza nowe wiersze, słowa i bajty na wejściu ( docs ).-l
policzyć tylko nowe linie.Uwagi:
DIR_NAME
się.
, aby wykonać polecenie w bieżącym folderze.-type f
aby uwzględnić katalogi (i dowiązania symboliczne) w liczeniu.Wyjaśnienie, dlaczego twój przykład nie działa:
W poleceniu, które pokazałeś, nie używasz „Pipe” (
|
) do łączenia dwóch poleceń, ale zepsuty pasek (¦
), którego powłoka nie rozpoznaje jako polecenia lub czegoś podobnego. Dlatego pojawia się ten komunikat o błędzie.źródło
f
W-type f
stojaki dla plików iwc -l
słownego linii liczy.-type f
uwzględniające katalogi w liczniku-print
Flaga nie jest potrzebna-print0
flagi.wc
mają opcję odczytu listy zakończonej zerem . Zobacz moją odpowiedź na alternatywę.Dla bieżącego katalogu:
źródło
.
find .
Jeśli potrzebujesz podziału na liczbę plików w każdym katalogu w bieżącym katalogu:
Oczywiście wszystko to może przebiegać w jednej linii. Nawiasy wyjaśniają, czyje wyjście
wc -l
ma być obserwowane (find $i -type f
w tym przypadku).źródło
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do
to naprawić. Zobacz Jak mogę odczytać plik (strumień danych, zmienna) wiersz po wierszu (i / lub pole po polu)?find
z pętli zewnętrznej jest po prostu niepotrzebną komplikacją.for i in */
; do`Możesz użyć
po zainstalowaniu pakietu drzewa za pomocą
(na komputerze z systemem Linux Debian / Mint / Ubuntu).
Polecenie pokazuje osobno nie tylko liczbę plików, ale także liczbę katalogów. Opcji -L można użyć do określenia maksymalnego poziomu wyświetlania (który domyślnie jest maksymalną głębokością drzewa katalogów).
Ukryte pliki można również dołączyć, podając
-a
opcję.źródło
-a
opcję ich włączenia.brew
i uruchombrew install tree
, najlepiej po uruchomieniubrew update
.Na moim komputerze
rsync
jest trochę szybszy niżfind | wc -l
w zaakceptowanej odpowiedzi:Drugi wiersz ma liczbę plików, 150,481 w powyższym przykładzie. Jako bonus otrzymasz także całkowity rozmiar (w bajtach).
Uwagi:
--dry-run
(lub-n
opcja w skrócie) jest ważne, aby nie faktycznie przenieść pliki!-x
opcji „nie przekraczaj granic systemu plików”, co oznacza, że jeśli ją/
wykonasz i masz podłączone zewnętrzne dyski twarde, to policzy tylko pliki na partycji głównej.źródło
find ~ -type f | wc -l
zajęło 1,7 / 0,5 / 1,33 sekundy (real / user / sys).rsync --stats --dry-run -ax ~ /xxx
zajęło 4,4 / 3,1 / 2,1 sekundy. To dotyczy około 500 000 plików na dysku SSD.Number of files: 487 (reg: 295, dir: 192)
rsync version 2.6.9 protocol version 29
Ponieważ nazwy plików w systemie UNIX mogą zawierać znaki nowej linii (tak, nowe linie),
wc -l
mogą liczyć zbyt wiele plików. Wydrukowałbym kropkę dla każdego pliku, a następnie policzyłem kropki:źródło
Łącząc kilka odpowiedzi tutaj razem, najbardziej użytecznym rozwiązaniem wydaje się być:
Może obsługiwać dziwne rzeczy, takie jak nazwy plików, które zawierają nawiasy spacji, a nawet nowe linie. Sortuje również dane wyjściowe według liczby plików.
Możesz zwiększyć liczbę po,
-maxdepth
aby policzyć również podkatalogi. Pamiętaj, że może to potencjalnie zająć dużo czasu, szczególnie jeśli masz mocno zagnieżdżoną strukturę katalogów w połączeniu z dużą-maxdepth
liczbą.źródło
echo -e
? Wydaje mi się, że umieścisz go, by spasować dowolne znaki nowej linii, ale będzie to również zniekształcać każdą inną nieregularną białą spację i spróbuje rozwinąć dowolne znaki zastępcze obecne dosłownie w nazwach plików. Po prostu wybrałbym coś podobnegofind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'
i żyłbym z wszelkimi aberracjami w danych wyjściowych, a może bawiłem się Bash'emprintf "%q"
do drukowania nazwy katalogu.Jeśli chcesz wiedzieć, ile plików i podkatalogów istnieje z bieżącego katalogu roboczego, możesz użyć tego jednowierszowego
Działa to w wersji GNU i po prostu pomija -e w poleceniu echo dla Linuksa BSD (np. OSX).
źródło
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
echo -e
(lub po prostu „echo” jak w poprzednim komentarzu) w niecytowanej nazwie katalogu powoduje zamianę jednego problemu na drugi.Jeśli chcesz uniknąć przypadków błędów, nie zezwalaj
wc -l
na wyświetlanie plików z nowymi liniami (które będą liczone jako 2+ plików)np. rozważmy przypadek, w którym mamy jeden plik z jednym znakiem EOL
Ponieważ przynajmniej gnu
wc
wydaje się nie mieć opcji odczytu / zliczenia listy zakończonej zerem (oprócz pliku), najłatwiejszym rozwiązaniem byłoby po prostu nie przekazywanie jej nazw plików, ale statyczne wyjście za każdym razem, gdy plik zostanie znaleziony, np. w tym samym katalogu co powyżejLub jeśli
find
to obsługujeźródło
Możesz użyć polecenia
ncdu
. Rekurencyjnie policzy, ile plików zawiera katalog Linux. Oto przykład wyniku:Ma pasek postępu, co jest wygodne, jeśli masz wiele plików:
Aby zainstalować go na Ubuntu:
Benchmark: Użyłem https://archive.org/details/cv_corpus_v1.tar (380390 plików, 11 GB) jako folderu, w którym należy policzyć liczbę plików.
find . -type f | wc -l
: do ukończenia około 1m20sncdu
: do ukończenia około 1m20sźródło
find . -type f | wc -l
incdu
.find
to , że pod maską wykonuje mniej więcej takie same wywołania systemowe, jak dladu
których jest backendncdu
. Właśnie ich straciłem.Przykładowe dane wyjściowe:
źródło
Aby ustalić, ile plików znajduje się w bieżącym katalogu, włóż
ls -1 | wc -l
. To służywc
do zliczenia liczby linii(-l)
na wyjściuls -1
. Nie liczy plików dotfiles. Proszę to zanotowaćls -l
(to jest „L” zamiast „1” jak w poprzednich przykładach), których użyłem w poprzednich wersjach tego HOWTO, faktycznie da ci liczbę plików o jeden większą niż faktyczna liczba. Dzięki Kam Nejad za ten punkt.Jeśli chcesz liczyć tylko pliki i NIE zawierasz dowiązań symbolicznych (tylko przykład tego, co jeszcze możesz zrobić), możesz użyć
ls -l | grep -v ^l | wc -l
(to tym razem „L”, a nie „1”, chcemy tutaj „długiej” listy) .grep
sprawdza każdą linię zaczynającą się na „l” (wskazującą łącze) i odrzuca tę linię (-v).Szybkość względna: „ls -1 / usr / bin / | wc -l” zajmuje około 1,03 sekundy na nieobciążonym 486SX25 (/ usr / bin / na tym komputerze ma 355 plików). „
ls -l /usr/bin/ | grep -v ^l | wc -l
” zajmuje około 1,19 sekundy.Źródło: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
źródło
ls -l
musi wykonaćstat
syscall na każdym pliku, aby odczytać jego rozmiar, mtime i inne właściwości, co jest wolne. W dużych katalogach (ponad 100 000 plików) uruchomieniels -l
może potrwać kilka minut. Aby liczyć tylko pliki, zawsze używajls -1 | wc -l
.ls -1
wciąż może być powolny w dużych katalogach, ponieważ musi sortować pliki. Po prostuprintf '%s\n' *
robi to samo i unika zewnętrznegols
połączenia (które i tak jest problematyczne ), ale najskuteczniejszym rozwiązaniem jest użycie polecenia, które nie wykonuje żadnego sortowania, takiego jakfind
. (Globalny wynik jest sortowany według powłoki.)Jeśli potrzebujesz rekurencyjnie policzyć określony typ pliku , możesz:
-l
służy tylko do wyświetlenia liczby linii na wyjściu.źródło
Z uderzeniem:
Utwórz tablicę wpisów za pomocą () i uzyskaj liczbę za pomocą #.
Ok, nie rekurencyjnie liczę plików, ale najpierw chciałem pokazać prostą opcję. Typowym przypadkiem użycia może być tworzenie kopii zapasowych najazdu pliku. Spowoduje to utworzenie logfile.1, logfile.2, logfile.3 itd.
Liczba rekurencyjna przy
globstar
włączonej wersji bash 4+ (jak wspomniano w @tripleee)Aby rekurencyjnie uzyskać liczbę plików, nadal możemy używać find w ten sam sposób.
źródło
**/*
wyliczanie rekurencyjne. Jest to nadal mniej wydajne niżfind
w przypadku dużych katalogów, ponieważ powłoka musi sortować pliki w każdym katalogu.W przypadku katalogów ze spacjami w nazwie ... (na podstawie różnych odpowiedzi powyżej) - rekurencyjnie wypisz nazwę katalogu z liczbą plików w:
Przykład (sformatowany dla czytelności):
Struktura katalogów jest lepiej wizualizowana za pomocą
tree
:ls -p | grep -v /
(użyte poniżej) pochodzi z odpowiedzi 2 na /unix/48492/list-only-regular-files-but-not-directories-in-current-directoryZastosowanie: Chcę znaleźć maksymalną liczbę plików spośród kilkuset katalogów (cała głębokość = 1) [dane wyjściowe ponownie sformatowane dla czytelności]:
sort -V
jest rodzajem naturalnym. ... Tak więc moja maksymalna liczba plików w dowolnym z tych katalogów (Claws Mail) to 4375 plików. Jeśli zostawię lewy pad ( https://stackoverflow.com/a/55409116/1904943 ) te nazwy plików - wszystkie są nazwane numerycznie, zaczynając od 1, w każdym katalogu - i pad do 5 cyfr łącznie, powinienem być w porządku .Uzupełnienie
Znajdź całkowitą liczbę plików, podkatalogów w katalogu.
źródło
Napisałem ffcnt aby przyspieszyć liczenie plików rekurencyjnych w określonych okolicznościach: dyski obrotowe i systemy plików, które obsługują mapowanie zasięgu.
Może to być rząd wielkości szybszy niż
ls
lubfind
podejście oparte, ale YMMV.źródło
Tutaj jest wiele poprawnych odpowiedzi. Oto kolejny!
gdzie
.
jest folder do przeszukania i10
liczba znaków, według której należy pogrupować katalog.źródło
znajdź -type f | wc -l
LUB (jeśli katalog jest katalogiem bieżącym)
odnaleźć . -typ f | wc -l
źródło
To zadziała całkowicie dobrze. Prosty krótki. Jeśli chcesz policzyć liczbę plików obecnych w folderze.
źródło
To alternatywne podejście z filtrowaniem formatu liczy wszystkie dostępne moduły jądra grub:
źródło
źródło