Do celów testowych chciałbym policzyć, ile plików obrazów znajduje się w katalogu, oddzielając każdy typ pliku obrazu według rozszerzenia pliku (jpg = „tak”. To dlatego, że później przyda się w innym skrypcie, który wykona akcję na każdym rozszerzeniu pliku). Czy mogę użyć czegoś takiego jak poniżej tylko do plików JPEG?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Biorąc pod uwagę rozszerzenia plików jpg, png, bmp, raw i inne, czy powinienem to while
zrobić?
źródło
JPG
ijpg
pliki, i chciał go rekurencyjnie więc moje rozwiązanie było napisaćfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Rekurencyjnie przegląda pliki i zlicza pasujące rozszerzenia:
źródło
źródło
find
. Może również pomóc przyszłym czytelnikom tych odpowiedzi, jeśli podasz krótkie wyjaśnienie swojego rozwiązania (na wypadek, gdyby chcieli zmodyfikować go w nieco innym przypadku).find
domyślnie jest to bieżący katalog, i właśnie z tego korzystam. Nie sądzę, żeby Bóg chciał, aby w nazwach plików były spacje, ale w tym przypadku działa to dobrze. Jeśli masz nowe linie, to zasługujesz na wszystko, co dostajesz. Pomyślałem o wyjaśnieniu, ale zdecydowałem, że odpowiedź będzie zbyt długa, myślę, że liczy się prostota. 99% przypadków w 1% przypadków. Prawdopodobnie jest to zgodne z wersją 7.Może może być krótszy
źródło
Wszystko, co się wiąże,
ls
może przynieść nieoczekiwane rezultaty ze specjalnymi znakami (spacja i inne symbole). Każdy bashizm (jak tablice) nie jest przenośny. Wszystko, co się wiąże,while read
jest zwykle powolne.Z drugiej strony
find
jest BARDZO elastyczny (wiele opcji do filtrowania), ma [przynajmniej] dwie składnie, które są bezpieczne dla specjalnych znaków ... i dobrze skaluje się w dużym katalogu.W tym przykładzie użyłem
-iname
dopasowania nazwy rozszerzenia zarówno wielkich, jak i małych liter. Ograniczyłem również-maxdepth 1
respektowanie pytania „w bieżącym katalogu”. Zamiast zliczać liczbę wierszy, w których nazwy plików mogą zawierać CR / LF,-print0
wydrukuje bajt NULL na końcu każdej nazwy pliku ... tak samo| tr -d -c "\000" | wc -l
dokładnie zlicza pliki (bajty NULL!).PS
-print0 | tr -d -c "\000" | wc -c
można zastąpić-printf "\000" | wc -c
lub nawet-printf '\n' | wc -l
.źródło
mogę po prostu użyć ls do czegoś takiego prostego IMO
lub
lub
źródło
Jeśli jesteś pewien rozszerzenia, możesz przejść z
find
podobnymiźródło
touch $'foo\nbar.jpeg
i nie zostanie policzony dwukrotnie zamiast raz. Lub gorzej, ktoś to robimkdir directory.jpeg; touch directory.jpeg/{1..100}.txt