Comando Bash: for i in *; do echo "${i##*.}"; done | uniq -c
Como encontrar arquivos diferentes na extensão baseada em UNIX. Vamos supor se eu tiver 100 arquivos para cada vamsi.log-vamsi100.log, krishna.txt-krishna100.txt, super.csv ..., rajat.jpeg ..., kiran.xml-kiran100.xml e etc. Minha exigência é se eu der o comando que só daria quantos padrões diferentes eu tenho em uma pasta. Ele também deve entregar um para cada extensão. Como posso conseguir isso?
ls -ltr
fornece todos os arquivos. Mas eu preciso saber quantos tipos diferentes de arquivos existem em uma pasta?
Comando Bash: for i in *; do echo "${i##*.}"; done | uniq -c
Um caminho:
find . -maxdepth 1 -type f | sort -u -t. -k3 | wc -l
Explicação:
find . -maxdepth 1 -type f
: encontre todos os arquivos normais no diretório atual sort -u -t. -k3
: classifique a saída em 3
arquivada com .
como um separador de campo e imprima apenas a primeira linha igual a wc -l
: conta as linhas Editar
Se você estiver usando zsh
shell, então você pode executar
echo ${(u)$(echo *(:e))} | wc -w
O resultado provavelmente é melhor do que em find
case - pelo menos arquivos multi-ponto são levados em conta, se você também estiver interessado em arquivos cujos nomes começam em .
then
echo ${(u)$(echo {.,}*(:e))} | wc -w
Eu acho que um simples ls *.extension
deve fazer o truque:)
Para contá-los, você pode usar ls *.extension -1 | wc -l
ls -1 -a | ls *.foo | wc -l
Onde foo é sua extensão.
find . -maxdepth 1 -type f | awk -F. '{print $NF}' | sort | uniq -c
awk
sendo usado para pegar o que vier depois do último .
(a "extensão")
sort
para obter todas as ocorrências de cada "extensão" agrupadas
uniq -c
para mostrar o número de duplicatas de cada linha / extensão.
Alguns scripts com bash-builtins e assotiative array
declare -A F_TYPE
unset F_TYPE
while IFS=" ," read b c d f
do
n="$b${c:+ $c}${d:+ $d}"
F_TYPE[$n]=$[${F_TYPE[$n]}+1]
done < <(file -b *)
for i in "${!F_TYPE[@]}"
do
echo "$i = ${F_TYPE[$i]}"
done
echo "Totally ${#F_TYPE[@]} types"