Chcę policzyć całkowitą liczbę plików w danym katalogu, które kończą się rozszerzeniem „.mp4”.
Otrzymuję następujące polecenie:
ls -F |grep -v / | wc -l
Liczy wszystkie pliki w danym katalogu, ale chcę liczbę plików, które kończą się rozszerzeniem .mp4.
Czy jest na to jakieś polecenie Ubuntu?
command-line
ls
Prakash V Holkar
źródło
źródło
ls -1
obsługa znaków nowego wiersza sprawia, że w tym przypadku warto przeanalizowaćls
dane wyjściowe. Zaznaczony jest niepoprawny w przypadku użycia opcji -R.Odpowiedzi:
Tutaj możesz to zrobić w ten sposób
To daje ci liczyć
źródło
-R
? Po co robić pełne,stat
gdy potrzebujesz tylko nazwy pliku? Dlaczego niels -1 *.jpg| wc -l
? (ok, nie działa, jeśli masz nazwy plików z nowymi.jpg
. Czy kiedykolwiek to przetestowałeś?*.jpg
jest on rozszerzany przez powłokę, a nie przezls
) i jeśli istnieją pliki, których nazwy zaczynają się od łączników..
. Ale tak naprawdę działa dobrze z myślnikami w nazwach, z wyjątkiem sytuacji, gdy/path/to/dir
pusty ciąg lub ścieżka względna zaczyna się od łącznika. Ale myliłem się wcześniej , mówiąc, żels
zastępuje postacie?
. Dzieje się tak, gdy stdout jest terminalem, ale tutaj wyjście jest potokiem, więcls
wysyła wszystkie znaki z nazw plików dowc
. To sprawia, że ta odpowiedź jest błędna bez flagi-q
lub,-b
aby zmienić to zachowanie , ponieważ nazwy plików mogą zawierać znaki nowej linii. Odpowiedź l0b0 jest wolna od tych problemów.Niestety ten łagodny problem jest trudny do rozwiązania w sposób, który obsługuje wszystkie nazwy plików i jest przenośny. Jest to bezpieczne (obsługuje ukryte pliki, ścieżki zawierające spacje, myślniki, a nawet znaki nowej linii)
i jest zgodne z POSIX:Jeśli nie chcesz, aby była rekurencyjna, po prostu dodaj
-maxdepth 1
.Nie powinieneś analizować
ls
danych wyjściowych.Test:
Porównaj z zaakceptowaną odpowiedzią :
Lub inne sugestie:
źródło
-printf x
zamiast-exec printf x \;
. Innymi słowy:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
nie ma potrzeby-exec
wykonywaniaprintf
polecenia zewnętrznego , które w przypadku dużej liczby plików będzie działało bardzo wolno , ponieważfind
musi rozwidlić (2) kopię samej siebie, a następnie wykonać (2)/usr/bin/printf
. Z-exec printf x \;
, należy to zrobić raz dla każdego pliku .-printf
nie jest obsługiwany w POSIXfind
, dlatego go nie użyłem.-mindepth
i-maxdepth
których użyłeś.find
zawiera-mindepth
i-maxdepth
nie zawiera,-printf
więc doceniam włączenie obu.Ten wyszukuje, sortuje i wyświetla wszystkie pliki według rozszerzenia w kolejności:
źródło
| sort -rn
na końcu i być może-mindepth 1
aktualny reż.head -n
aby uzyskać górną n.Myślę, że to bardzo proste, jak wykonać następujące polecenia.
lub
Myślę, że powyższe polecenia obliczają liczbę nazw plików i katalogów
*.mp4
więc sugeruję użycie
-type f
opcji jakofind
parametru jak poniżej.Ponadto
ls -lR
może być używany jakofind .
źródło
Możesz użyć
ls -1 *.mp4 | wc -l
.Spowoduje to wyświetlenie listy wszystkich plików kończących się
.mp4
, drukowanie każdego pliku w nowej linii (ls -1 *.mp4
), potokowanie danych wyjściowych, dowc
których policzy liczbę nowych linii za pomocą-l
flagi.źródło
*.mp4
jest rozszerzany przez powłokę, niels
, to się nie powiedzie, jeśli.mp4
w katalogu znajduje się tak wiele plików, że ich lista nie może zostać przekazanals
jako argument.--.mp4
--
rozwiąże drugi przypadek; ten pierwszy wyświetli komunikat o błędzie (potrzebujesz dużo plików!) i kolejne fajne pytanie tutaj. Narożniki, ale warto zauważyć, tak.-q
czy-b
to ma nie tolerują newlines w nazwach plików. Jeśli uciekaszls -1 *.mp4
ze swojego terminalu bez rury, zobaczysz ,ls
że jego stdout jest terminalem i bierze,-q
jak sugeruje, drukowanie?
s. Ale to zachowanie zanika, gdy wyjście jest przesyłane potokowo.ls -1 *.mp4 | wc -l
przeliczyć, jeśli są nowe linie.ls -1 *.mp4 | cat
pokazuje, cowc
„widzi”. (Podobnie-1
sugerowane jest, gdy standardowe wyjście nie jest terminalem, więc jest opcjonalne.)ls -1q -- *.mp4 | wc -l
Prawie działa, ale nie z zerowymi plikami .mp4.To powinno dać ci listę plików z rozszerzeniem .mp4
W połączeniu z
wc -l
daje liczyćjeśli chcesz, aby wyszukiwanie zawierało podkatalogi
źródło
wc -l
ls /directory/*.mp4
powoduje, że powłoka rozszerza glob i wykonuje coś takiego.ls /directory/file1.mp4 /directory/file2.mp4 ...
To się nie powiedzie, jeśli katalog zawiera więcej plików mp4, niż można przekazać jako argumentyls
.W skrócie, jednym zimnym rozwiązaniem jest używanie tablic z glob:
źródło
Zamień (.csv na żądane rozszerzenie)
Objaśnienie: Myślę, że prostym schematem jest pobranie listy plików i policzenie rozszerzenia za pomocą grep.
\.
dopasować.
i$
dopasować rozszerzenie na końcu linii. Działa, ponieważ gdy dane wyjściowe ls są przesyłane potokowo, w jednej linii wysyłana jest jedna nazwa pliku, którą można zweryfikować, uruchamiając:źródło
grep --count
możesz również użyćgrep -c
.Sprawdź, jak liczyć pliki według rozszerzenia w systemie Linux? , daje dobrą odpowiedź i wyjaśnienie, możesz użyć następującego polecenia:
źródło