Como encontrar arquivos diferentes no UNIX com base em. extensão?

2

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?

    
por Vamsi Krishna 07.11.2014 / 13:54

6 respostas

3

Comando Bash: for i in *; do echo "${i##*.}"; done | uniq -c

    
por 07.11.2014 / 15:29
1

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
    
por 07.11.2014 / 14:04
1

Eu acho que um simples ls *.extension deve fazer o truque:)

Para contá-los, você pode usar ls *.extension -1 | wc -l

    
por 07.11.2014 / 15:24
1
ls -1 -a | ls *.foo | wc -l

Onde foo é sua extensão.

    
por 07.11.2014 / 16:52
1

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.

    
por 28.08.2016 / 14:48
0

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"
    
por 07.11.2014 / 14:38