Jestem w stanie wyświetlić listę wszystkich katalogów według
find ./ -type d
Próbowałem wyświetlić zawartość każdego katalogu i policzyć liczbę plików w każdym katalogu, używając następującego polecenia
find ./ -type d | xargs ls -l | wc -l
Ale to zsumowało całkowitą liczbę wierszy zwróconych przez
find ./ -type d | xargs ls -l
Czy istnieje sposób, aby policzyć liczbę plików w każdym katalogu?
./
?Odpowiedzi:
Zakładając, że masz GNU find, pozwól mu znaleźć katalogi, a bash zajmie się resztą:
źródło
find . -maxdepth 1 -type d | sort
; do y =find $x | wc -l
; echo $ x, $ y; gotowefind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
w pierwszym komentarzu powinien znajdować się wewnątrz cudzysłowów, aby poprawnie obsługiwać nazwy katalogów ze spacjami . :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Spowoduje to wyświetlenie liczby plików na katalog dla bieżącego poziomu katalogu:
źródło
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Dodaj,| sort -nr
aby posortować według liczby zamiast nazwy katalogu.find. -type f
aby znaleźć wszystkie elementy pliku typucut -d/ -f2
aby wyciąć swój określony foldersort
aby posortować listę nazw folderówuniq -c
aby zwrócić, ile razy każda nazwa folderu została policzonaźródło
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Możesz znaleźć wszystkie pliki, usunąć nazwy plików, pozostawiając linię zawierającą tylko nazwę katalogu dla każdego pliku, a następnie policzyć, ile razy pojawia się każdy katalog:
Jedynym problemem jest to, że masz jakiekolwiek nazwy plików lub nazwy katalogów zawierające znak nowej linii, co jest raczej mało prawdopodobne. Jeśli naprawdę musisz martwić się nowymi wierszami w nazwach plików lub nazwach katalogów, proponuję je znaleźć i naprawić, aby nie zawierały nowych linii (i po cichu przekonać winnego do błędu w ich postępowaniu).
Jeśli jesteś zainteresowany liczbą plików w każdym podkatalogu bieżącego katalogu, licząc wszystkie pliki w dowolnych podkatalogach wraz z plikami w bezpośrednim podkatalogu, dostosowałbym
sed
polecenie tylko do drukowania katalog najwyższego poziomu:Pierwszy wzór przechwytuje początek nazwy, kropkę, ukośnik, nazwę aż do następnego ukośnika i ukośnik i zastępuje wiersz tylko pierwszą częścią, więc:
jest zastąpiony przez
Drugie zastąpienie przechwytuje pliki bezpośrednio w bieżącym katalogu; nie mają ukośnika na końcu, a te są zastępowane przez
./
. Sortowanie i liczenie działa wtedy tylko na liczbie nazw.źródło
find
. Niektórzy mogą: jeśli istnieje plikdir1/dir2/dir3/file1
, aledir1/dir2
zawiera tylko podkatalogi (bez zwykłych plików), wtedy można wywnioskować o jego obecności. Ale jeślidir1/dir4
nie ma plików, nazwa po prostu się nie pojawia.Oto jeden sposób, ale prawdopodobnie nie jest to najbardziej efektywny.
Daje takie dane wyjściowe, jak nazwa katalogu, po której następuje liczba wpisów w tym katalogu. Zwróć uwagę, że licznik wyjściowy będzie również zawierał pozycje katalogu, które mogą nie być tym, czego chcesz.
źródło
bash
,ls
,wc
) dla każdego katalogu znaleziona przezfind
.man bash
,A -- signals the end of options and disables further option processing
. W tym przypadku zapobiegnie to, że błędnie nazwany plik znaleziony jako część znalezienia nie stanie się częścią przetwarzania argumentów dla bash.Rozwiązanie wszystkich innych ma jedną lub drugą wadę.
Wyjaśnienie:
-type d
: interesują nas katalogi.-readable
: Chcemy ich tylko wtedy, gdy można wyświetlić listę plików, które się w nich znajdują. Zauważ, żefind
nadal będzie generować błąd, gdy spróbuje wyszukać w nich więcej katalogów, ale to zapobiega ich wywoływaniu-exec
.-exec sh -c BLAH sh {} ';'
: dla każdego katalogu uruchom ten fragment skryptu,$0
ustawiając wartośćsh
i$1
ustawioną na nazwę pliku.printf "%s " "$1"
: przenośnie i minimalnie wypisuje nazwę katalogu, po której następuje tylko spacja, a nie znak nowej linii.ls -1UA
: wyświetla pliki, po jednym w każdym wierszu, w kolejności katalogów (aby uniknąć blokowania potoku), wyłączając tylko specjalne katalogi.
i..
wc -l
: policz linieźródło
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Nieznacznie zmodyfikowana wersja odpowiedzi Sebastiana za pomocą
find
zamiastdu
(aby wykluczyć narzut związany z rozmiarem pliku, którydu
musi działać i który nigdy nie jest używany):-mindepth 2
parametr służy do wykluczania plików w bieżącym katalogu. Jeśli ją usuniesz, zobaczysz kilka linii, takich jak:(podobnie jak
du
wariant bazujący)Jeśli musisz policzyć również pliki w bieżącym katalogu, użyj tej ulepszonej wersji:
Dane wyjściowe będą wyglądać następująco:
źródło
Można to również zrobić za pomocą pętli nad ls zamiast find
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Wyjaśnienie:
for f in */;
- pętla po wszystkich katalogachdo echo "$f ->
- wydrukuj nazwę każdego katalogu$(ls $f | wc -l)
- wywołaj ls dla tego katalogu i policz linieźródło
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Powinno to zwrócić nazwę katalogu, po której następuje liczba plików w katalogu.
Przykładowe dane wyjściowe:
Jest
export -f
to wymagane, ponieważ-exec
argumentfind
funkcji bash nie pozwala na wykonanie funkcji bash, chyba że wywołasz ją jawnie i musisz jawnie wyeksportować funkcję zdefiniowaną w bieżącym zakresie do nowej powłoki.źródło
./dir1/dir2/dir3
(zliczanie plików wdir1
i ich podkatalogach razem, zamiast liczenia plikówdir1/dir2/dir3
oddzielnie od tych wdir1/dir2
i oba oddzielnie od tych w/dir1
).Połączyłem odpowiedź @glenn jackman i odpowiedź @ pcarvalho (na liście komentarzy jest coś nie tak z odpowiedzią pcarvalho, ponieważ dodatkowa funkcja sterowania stylem znaku ' ' '' (lewy przycisk)).
Mój skrypt może zaakceptować ścieżkę jako rozszerzenie i posortować listę katalogów jako
ls -l
, a także może rozwiązać problem "miejsca w nazwie pliku" .Moja pierwsza odpowiedź w stackoverflow i mam nadzieję, że może komuś pomóc ^ _ ^
źródło
odnaleźć . -type f -printf '% h \ n' | sort | uniq -c
podaje na przykład:
źródło
Próbowałem z niektórymi innymi tutaj, ale skończyło się na tym, że podfoldery zostały uwzględnione w liczbie plików, gdy chciałem tylko pliki. Spowoduje to wydrukowanie
./folder/path<tab>nnn
z liczbą plików, bez podfolderów, dla każdego podfolderu w bieżącym folderze.źródło
Łatwy sposób na rekurencyjne wyszukiwanie plików danego typu. W tym przypadku pliki .jpg dla wszystkich folderów w bieżącym katalogu:
find . -name *.jpg -print | wc -l
źródło
Super szybkie cudowne polecenie, które rekurencyjnie przechodzi przez pliki, aby policzyć liczbę obrazów w katalogu i uporządkować dane wyjściowe według rozszerzenia obrazu:
Kredyty: https://unix.stackexchange.com/a/386135/354980
źródło
To może być inny sposób przeglądania struktur katalogów i dostarczania szczegółowych wyników.
źródło
Edytowałem skrypt tak, aby wykluczyć wszystkie
node_modules
katalogi wewnątrz analizowanego.Można to wykorzystać do sprawdzenia, czy liczba plików w projekcie przekracza maksymalną liczbę, którą może obsłużyć obserwator plików.
Aby sprawdzić maksymalną liczbę plików, które system może oglądać:
node_modules
folder powinien zostać dodany do ścieżek wykluczonych z IDE / edytora w powolnych systemach, a liczba innych plików nie powinna idealnie przekraczać maksimum (można to jednak zmienić).źródło
To da ogólną liczbę.
źródło