디렉터리 및 폴더를 탐색하는 동안 파일 수 가져오기

디렉터리 및 폴더를 탐색하는 동안 파일 수 가져오기
recursiveprint() {
#FILES_COUNT=0

cd $1
  for d in *; do
    if [ -d "$d" ]; then
       (recursiveprint "$d")
    fi
    if [ -f "$d" ]; then
       file_name=$(basename "$d")
        ((FILES_COUNT++))
        clear
        echo  "$file_name"
        echo "total count = $FILES_COUNT"
    fi
    done
}
recursiveprint ${START_DIR}

문제는 한 폴더를 반복하면 다른 폴더를 반복하기 전에 개수가 다시 0으로 설정된다는 것입니다. 전체적으로 서로 다른 폴더에 30개의 파일이 있고 개수는 6개가 됩니다. 이는 반복되는 마지막 폴더의 파일 수입니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?

답변1

if [ -d "$d" ]; then
   (recursiveprint "$d")
fi

이 줄 주위의 괄호는 (recursiveprint "$d")하위 쉘에서 함수를 실행합니다. 서브셸이 시작되면 값이 FILES_COUNT복제되고 서브셸 내 재귀 호출에서 변경된 내용이 주변 환경에 적용되지 않습니다.

하위 셸이 없으면 더 잘 작동하지만 함수 인스턴스에서 반환할 때 상위 디렉터리로 수동으로 돌아가야 합니다. cd ..함수 내 호출에 사용할 수 있지만 절대 경로로 지정되어 있어도 원래 작업 디렉터리로 돌아갈 수 있도록 변수를 사용하겠습니다.

recursiveprint() {
    local oldpwd=$PWD
    cd "$1"
    ...
        if [ -d "$d" ]; then
           recursiveprint "$d"          # no parenthesis here
        fi
    ...
    cd "$oldpwd"
}

또한 *점으로 시작하는 파일 이름은 기본적으로 일치하지 않으므로 shopt -s dotglob필요한 경우 이를 사용하십시오.

답변2

에 익숙해

find /my/dir/ -type f | grep -c .

당신을 위해 일합니까?

답변3

find .// -type f | grep -c '^\.//'

모든 파일을 안정적으로 계산합니다(이름에 줄바꿈이 포함된 파일도 포함).

관련 정보