각 하위 디렉터리 및 해당 하위 디렉터리에서 문자열과 일치하는 줄 수를 계산합니다.

각 하위 디렉터리 및 해당 하위 디렉터리에서 문자열과 일치하는 줄 수를 계산합니다.

현재 디렉터리의 각 하위 디렉터리에서 하위 디렉터리의 문자열과 해당 하위 디렉터리의 모든 파일에 대해 일치하는 줄 수를 인쇄하고 싶습니다.

예를 들어, 내가 가지고 있는 경우

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

test/folderin 및 모든 하위 디렉터리의 발생 횟수를 보고 싶습니다 . 디렉터리당 한 줄입니다. 예상 출력:

/folder: 4
/folder/a: 3
/folder/b: 1
/folder/b/c: 1

답변1

이것은 또 다른 트릭입니다. stdout을 사용하여 모든 하위 디렉터리에서 재귀적인 합계를 캡처하기 때문에 stderr를 남용하여 결과를 인쇄합니다.

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
}

답변2

다음 bash 스크립트는 ./각 결과에 접두사를 추가한다는 점을 제외하면 입력 사례에 작동하는 것 같습니다.

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

관련 정보