Jak mogę użyć licznika słów ( wc
) i potoków, aby policzyć, ile plików lub katalogów znajduje się w /usr/bin
katalogu?
scripting
find
wc
file-types
gotówkowy
źródło
źródło
Odpowiedzi:
Jednym z podejść byłoby skorzystanie z,
ls
aby dać nam listę plików, ale chcemy, aby ta lista wyświetlała tylko 1 plik lub katalog w wierszu.-1
Przełącznik zrobi to za nas.Przykład
Utwórz powyższe przykładowe dane w pustym katalogu.
Sprawdź to:
Teraz do zliczenia można użyć
wc -l
do zliczenia liczby wierszy odpowiadających plikowi lub katalogowi w danychls -1
wyjściowych.(zauważ jednak, że nie zawiera ukrytych plików)
Liczenie plików lub katalogów, po prostu nie razem
Aby policzyć pliki lub katalogi, musisz nieco zmienić taktykę. W tym przypadku skorzystałbym,
ls -l
ponieważ pokazuje, co to jest katalog, a co plik.Przykład
Następnie możemy użyć
grep
do odfiltrowania katalogów lub katalogów innych niż katalogi:Teraz użyj
wc -l
ponownie, aby policzyć powyższe:Chociaż można uniknąć
wc
całkowicie, a stosowaniegrep
jest-c
opcja:(znowu, ukryte pliki nie są uwzględnione. Pamiętaj, że katalogi i zwykłe są dwoma typami plików. Istnieje wiele innych, takich jak nazwane potoki, dowiązania symboliczne, urządzenia, gniazda ...).
Rekurencja
Jeśli potrzebujesz rekursywnie znaleźć pliki i katalogi
/usr/bin
, prawdopodobnie zechcesz całkowicie zmienić taktykę i skorzystać z innego narzędzia o nazwiefind
.Przykład
(chociaż powyżej
/usr/bin
siebie jest wliczone w liczenie)Tych samych technik, których użyłem powyżej, można użyć
ls
do zrobienia czegoś podobnego, alels
ogólnie nie jest to dobre narzędzie do analizy wyników.find
z drugiej strony został stworzony do tego i oferuje przełączniki do wyszukiwania plików lub katalogów.(zauważ, że tym razem
find
zawiera ukryte pliki (oprócz.
i..
)).nowe linie?
Nigdy nie dowiedziałem się, dlaczego znak nowej linii jest znakiem legalnym, którego można używać podczas tworzenia nazw plików lub nazw katalogów. Tak więc metody omówione powyżej wykorzystują
wc
ils
nie byłyby z nimi sprzeczne, więc używaj ich z myślą o tym.Przykład
Utwórz katalog i nazwę pliku z nowymi liniami.
ls
pokazuje je poprawnie:Ale
wc
liczy katalogi i pliki zawierające znaki nowej linii jako 2 elementy, a nie jeden.Jedną z metod obejścia tego problemu , jeśli używa się implementacji GNU,
find
jest wykorzystaniefind
możliwości wydrukowania czegoś innego w miejsce każdego znalezionego pliku, a następnie policzenie go zamiast tego.Przykład
Tutaj jesteśmy odkrycie wszystko w bieżącym katalogu (z wyjątkiem
..
), a drukuje kropki (.
) dla każdego, a następnie liczenie kropek za pomocąwc
„s zdolność count bajtów zamiast liniiwc -c
.Bibliografia
źródło
/usr/bin
będą dobrze sformatowane (i nie będą zawierały spacji, więc technicznie możesz nawet po prostuecho * | wc -w
), warto zauważyć, że wszystkie zepsują się na nazwach plików zawierających nowe linie.ls -l
lubls -1
złamie b / c liczymy linie, a nie słowa!find
Może pęknąć, ale znowu liczymy linie nie słowa.touch $'foo\nbar'
w pustym katalogu, po którym następuje jedno z twoich poleceń (powiedzmyls -1 | wc -l
) zgłasza dwa pliki, a nie jeden - ponieważ ten plik ma dwie liniewc
. Chyba żels
zastąpi nowy wiersz inną postacią (nie sądzę, że tak, ale znowu nie jestem teraz w stanie przetestować).wc -c
jest problem z liczeniem okresów?Jeśli chcesz uzyskać podział liczby każdego typu plików rekurencyjnie w jakimś katalogu, z GNU
find
, możesz zrobić:W
/usr/bin
moim systemie daje to:On
/dev
:W przypadku dowiązań symbolicznych, jeśli wolisz je policzyć jako typ pliku, na który wskazują
symbolic links
, możesz zmienić to na:Co teraz daje moje
/usr/bin
:(zepsute dowiązanie symboliczne to dowiązanie symboliczne do pliku, dla którego
find
nie można określić typu, ponieważ plik nie istnieje lub znajduje się w katalogu, do którego nie masz dostępu, lub istnieje pętla w rozdzielczości ścieżki do pliku W moim przypadku te 2, w których dowiązania symboliczne do plików, które już zniknęły).Żaden z nich się nie liczy
.
i..
. Jeśli chcesz je uwzględnić (dlaczego?), Nie ma innego wyjściafind
niż założenie, że są one dostępne dla każdego katalogu i licz je systematycznie:Co następnie daje moje
/usr/bin
:Jeśli nie masz dostępu do GNU
find
, możesz przepisać pierwszy jako:Mówiąc ściśle, nie liczymy plików, ale wpisy katalogu . Jak
/usr/bin
zwykle katalog zawiera kilka pozycji wskazujących na ten sam plik. Na przykład tutaj mam:Są to 3 wpisy katalogu (inaczej nazwy plików lub twarde łącza) do tego samego pliku (ten z i-węzłem 672252. Aby policzyć pliki zamiast pozycji katalogu i GNU
find
i GNUuniq
(ignorowanie.
i..
pliki, które i tak są twardymi linkami do innych katalogów):W moim
/usr/bin
przypadku daje to:źródło
Nie powiedziałeś, czy chcesz rekursywnie cały plik w / usr / bin, czy tylko poniżej pierwszego poziomu. Poza tym, jak zdobędziesz wyliczane słowa? Zwykłym sposobem na sprawdzenie tego jest uruchomienie find w wc. W ten sposób: znajdź / usr / bin | wc -l Znajdź wyświetli wszystko, katalogi i pliki. Wc -l policzy wszystkie linie w wynikach wyszukiwania. Czy to zadanie klasowe? W porządku, jeśli tak, ale zastanawiałem się, dlaczego potrzebowałeś tych informacji, aby móc dokładniej dostosować odpowiedź. Daj mi znać, jeśli potrzebujesz więcej. Costa
źródło
W skrócie, bez zewnętrznych narzędzi.
W skrócie, bez zewnętrznych narzędzi i rekurencji.
źródło
.
ani..
wpisów. Możesz rozróżnić plik od zwykłego pliku.