Usando o grupo by in ls

1

Estou usando o cygwin no Windows.

Eu desejo contar o número de arquivos jpeg, gif e png de uma pasta raiz.

Agora eu posso fazer:

ls . -1R | grep '.jpeg' |  wc -l
ls . -1R | grep '.gif' |  wc -l
ls . -1R | grep '.png' |  wc -l

Mas pensei que, se houvesse uma sintaxe group by type, eu poderia fazer isso com um comando em vez de três?

Alguma dica?

    
por dublintech 21.02.2013 / 12:01

3 respostas

2

tente isso:

ls | awk -F '.' '{print $2}' | sort | uniq -c | sort -n

explicação:

o awk divide os arquivos no '.' e produz a segunda parte.

sort está classificando todas as saídas.

uniq faz o agrupamento e conta por grupo

o segundo tipo classifica os grupos por contagem

Provavelmente, haveria uma maneira de melhorar isso, tornando a saída awk a última parte, em vez da segunda parte. Mas eu esqueci como fazer isso, eu tenho certeza que o man awk pode te dizer.

    
por 21.02.2013 / 12:20
1

Você também pode usar find :

find . -name \*.jpeg -o -name \*.gif -o -name \*.png | sed 's/.*\.\([^.]\+\)//' | sort | uniq -c

Isso retorna o número de arquivos em . com extensões jpeg , gif e png formatados com um resultado por linha:

 123 gif
 110 jpeg
1832 png

Adicione outras extensões conforme necessário.

Explicação do comando:

  • find . -name \*.jpeg -o -name \*.gif -o -name \*.png

    procura arquivos que correspondam a ' .jpeg' ou ' .gif' ou '* .png'.

  • sed 's/.*\.\([^.]\+\)//'

    remove o nome do arquivo e apenas deixa a extensão, por exemplo, file.gif se torna gif

  • sort

    classificar extensões. Depois desse comando, a saída é assim:

    gif
    gif
    gif
    (...)
    jpeg
    jpeg
    (...)
    png
    (...)
    
  • uniq -c

    informe o número de ocorrências.

por 21.02.2013 / 12:38
1

Essas soluções funcionam para o bash. Não tenho certeza se você deseja o número de cada tipo de arquivo ou o total.

Se você quiser o número total de arquivos de imagem, tente o seguinte:

ls  {*jpg,*png,*gif} | wc -l

Isso significa ls de qualquer coisa que termine com jpg , png ou gif e passe por wc .

Se você quiser o número de cada um, faça:

for n in jpg png gif; do echo -ne "$n\t"; ls *$n | wc -l; done

Este é um loop for. Ele será executado 3 vezes, uma vez para cada jpg png e gif. Cada vez que o loop é executado, a variável $n tomará uma das extensões como um valor. Portanto, para a primeira execução, ls *$n será expandido para ls *jpg . echo significa apenas "imprimir". echo -ne significa imprimir sem uma nova linha ( -n ) e permitir caracteres de escape -e , isso permite usar o caractere de tabulação \t .

Isso funcionará bem, contanto que você tenha pelo menos um arquivo de cada tipo, caso contrário ele irá reclamar (ele ainda funcionará, ele só vai reclamar). Para uma versão um pouco mais robusta, tente isto:

for n in jpg png gif; do echo -ne "$n\t"; echo 'ls *$n 2>/dev/null | wc -l ' || echo 0; done

Esse loop é semelhante ao anterior, mas verifica se o comando ls retorna um erro. O || operando no bash significa "Do isto ou, se este não funcionou, faça esse ". Então, eu estou dizendo bash para ls *jpg etc e se ele não funcionar, ou seja, se não houver arquivos com essa extensão, echo (print) 0 . O 2>/dev/null faz com que qualquer mensagem de erro seja descartada.

Você também pode usar awk (esta é uma modificação ligeira da resposta de mauro stettler contará apenas os arquivos com as extensões de seu interesse):

ls {*.jpg,*.png,*.gif} | awk -F'.' '{print $NF}' | sort | unic -c 
    
por 21.02.2013 / 12:14