conta o número de arquivos (com base na extensão do arquivo) em várias pastas

0

Acho que é melhor descrito com um exemplo

parent1 (located inside /home/myuser
  - folder1
    - test11.png
    - test11.txt
    - folder11
      - test111.png
    - folder12
      - test121.png
      - test122.png
  - folder2
    - test21.png

se eu puder meu script

get-number-of-files-per-folder "parent" png

a saída deve ser:

folder1: 4
folder2: 1

no momento, estou usando este comando, mas parece que conta todos os arquivos e não apenas a extensão de arquivo que listei.

find /home/myuser/parent -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -iname "*png" -type f | wc -l)" file\(s\)' \;

Como eu sei que está errado? porque quando eu corri isto

find /home/myuser/parent -iname '*jpg' -type f | wc -l

diz que eu tenho zero arquivos JPG, mas o script acima diz que eu tenho xx arquivos dentro de uma pasta.

    
por mrjayviper 20.09.2017 / 17:52

3 respostas

3

Abordagem de script de shell simples:

#!/bin/sh

if [ "$#" -ne 2 ]; then
    echo "Usage: $0 directory extension" >&2
    exit 1
fi
cd "$1" || exit 1
for d in *; do
    [ -d "$d" ] || continue
    printf "%s: %i\n" "$d" \
        "$(find "$d" -type f -name "*.$2" -printf '1\n' | wc -l)"
done

... que apenas usa shell para percorrer todos os arquivos / diretórios em seu diretório de destino (bem, exceto os ocultos que começam com . ). Ele ignora os não-diretórios e, para os diretórios, imprime o nome seguido pela contagem de arquivos (obtida usando find e wc ). O find … -printf '1\n' é para que o achado imprima apenas 1 para cada arquivo encontrado - não imprimir o nome do arquivo evita todos os problemas com, por exemplo, novas linhas em nomes de arquivos. E só precisamos contar as linhas, nada mais.

    
por 20.09.2017 / 18:40
3

Assumindo que o GNU find e supondo que seus nomes de arquivos não tenham novas linhas incorporadas:

find /path/to/parent1 -mindepth 2 -type f -iname '*.png' -printf '%P\n' | \
    sed 's#/.*##' | \
    sort | \
    uniq -c
    
por 20.09.2017 / 18:03
1

encontre + abordagem awk para sua estrutura de pastas atual /home/myuser/parent1/<folder> :

find /home/myuser/parent1 -type f -name "*.png" \
     | awk -F'/' '{ a[$5]++ }END{ for(i in a) print i,a[i] }'
  • $5 - aponta para um nome de pasta no nível necessário (ajuste isso se sua estrutura de pastas for diferente; deve ser dois a mais do que a profundidade de diretórios do pai. Portanto, para /tmp/parent1 , será $4 e para /home/myuser/Documents/parent1 , seria $6 ).
por 20.09.2017 / 18:09

Tags