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 '^\.//'
모든 파일을 안정적으로 계산합니다(이름에 줄바꿈이 포함된 파일도 포함).