Para fins de teste, eu gostaria de contar quantos arquivos de imagens estão dentro de um diretório, separando cada tipo de arquivo de imagem por extensão de arquivo (jpg = "yes". Isso porque mais tarde será útil para outro script que executará uma ação em cada extensão de arquivo). Posso usar algo como o seguinte apenas para arquivos JPEG?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Considerando as extensões de arquivo jpg, png, bmp, raw e outras, devo usar um while
ciclo para fazer isso?
fonte
JPG
ejpg
arquivos, e queria-o de forma recursiva por isso a minha solução era escreverfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Isso percorre recursivamente arquivos e conta extensões que correspondem:
fonte
fonte
find
. Além disso, pode ajudar futuros leitores dessas respostas se você fornecer uma breve explicação sobre sua solução (caso eles desejem modificá-la para um caso um pouco diferente).find
padrão para o diretório atual, que é como eu uso isso. Eu não acho que Deus pretendia que os nomes de arquivos tivessem espaços neles, mas isso funciona bem para esse caso. Se você tem novas linhas, merece tudo o que recebe. Pensei em uma explicação, mas decidi que daria uma resposta muito longa, acho que a simplicidade é o que importa. 99% dos casos em 1% das vezes. Provavelmente é compatível com a versão 7.Talvez possa ficar mais curto
fonte
Qualquer coisa envolvida
ls
provavelmente produzirá resultados inesperados com caracteres especiais (espaço e outros símbolos). Qualquer basismo (como matrizes) não é portátil. Qualquer coisa envolvidawhile read
é geralmente lenta.Por outro lado,
find
é MUITO flexível (muitas opções para filtrar), possui [pelo menos] duas sintaxes que são à prova de falhas para caracteres especiais ... e Escala bem no diretório grande.Neste exemplo, usei o
-iname
nome da extensão em maiúsculas e minúsculas. Também restringi a-maxdepth 1
respeitar a sua pergunta "no diretório atual". Em vez de contar o número de linhas, onde os nomes de arquivos podem incluir CR / LF,-print0
imprimirá um byte NULL no final de cada nome de arquivo ... assim| tr -d -c "\000" | wc -l
como a contagem precisa de arquivos (NULL bytes!).PS
-print0 | tr -d -c "\000" | wc -c
pode ser substituído por-printf "\000" | wc -c
ou mesmo-printf '\n' | wc -l
.fonte
pode apenas usar ls para algo tão simples como IMO
ou
ou
fonte
Se você tem certeza da extensão, você pode ir com
find
comofonte
touch $'foo\nbar.jpeg
e seja contado duas vezes em vez de uma vez. Ou pior, alguém sabemkdir directory.jpeg; touch directory.jpeg/{1..100}.txt