conta as linhas correspondentes à string em cada subdiretório e seus subdiretórios

2

Em cada subdiretório do meu diretório atual, gostaria de imprimir o número de correspondências de linha em relação a uma string para todos os arquivos no subdiretório e em seus subdiretórios.

Por exemplo, se eu tiver

cat /folder/a/file1.txt
test
x
x

cat /folder/a/file2.txt
x
test
x
test

cat /folder/b/c/file3.txt
x
test
x

Eu quero ver o número de ocorrências de test em /folder e todos os seus subdiretórios. Uma linha por diretório. Saída esperada:

/folder: 4
/folder/a: 3
/folder/b: 1
/folder/b/c: 1
    
por mark 17.11.2016 / 03:41

2 respostas

1

Aqui está outro truque; isso faz com que o stderr imprima os resultados, porque ele usa stdout para capturar os totais recursivos de quaisquer subdiretórios.

function countdirhelper {
  count=0
  string=$1
  for f in *
  do
    if [ -f "$f" ]
    then
      add=$(grep -c -- "$string" "$f")
    elif [ -d "$f" ]
    then
      add=$(cd "$f"; countdirhelper "$string")
    fi
    count=$((count + add))
  done
  printf "%s: %d\n" "$PWD" "$count" >&2
  printf %d "$count"
}

function countdir {
  countdirhelper "$1" > /dev/null
}
    
por 17.11.2016 / 21:01
0

O seguinte script parece funcionar em seu caso de entrada, exceto pelo prefixo ./ para cada resultado:

find . -type f |\
(
  while read FN
  do
    echo "'dirname $FN'"
    grep test "$FN" | wc -l
  done
) |\
(
  unset CTR
  declare -A CTR
  while read DN
  do
    read AA
    while [ "$DN" != "." ]
    do
      PN=${CTR[$DN]}
      [ "$PN" == "" ] && PN=0
      CTR[$DN]=$((PN+AA))
      DN="'dirname "$DN"'"
    done
  done
  for DN in "${!CTR[@]}"
  do
    echo "$DN: ${CTR[$DN]}"
  done
) | sort
    
por 17.11.2016 / 05:17

Tags