파일과 디렉터리를 재귀적으로 계산

파일과 디렉터리를 재귀적으로 계산

이에 대한 도움이 필요합니다.

내가 디렉토리에 있고 이 디렉토리에 다른 디렉토리와 파일 등이 있다고 가정해 보겠습니다.

재귀 함수를 사용하여 그 안과 하위에 있는 모든 파일과 디렉터리의 수를 계산하고 싶습니다.

wc ... grep 또는 find를 사용하여 문제를 해결할 수 있다는 것을 알고 있지만 여기서는 첫 번째 재귀 함수를 사용하려고 합니다.

이것이 내가 지금까지 한 일이지만 제대로 작동하지 않습니다.

    counting(){


    for i in $(ls -a $1)
    do
          if [ -d $1/$i ];then
          let d++
          cd $1/$i       
          counting $i
          cd ..
          elif [ -f $1/$i ];then
          let f++
          fi
    done

  }

counting $1
echo "number of files = $f ; number of directories = $d"

답변1

다음은 (완전성을 주장하지 않고) 개선할 수 있는 몇 가지 사항입니다.

  1. 절대의 출력을 구문 분석합니다 ls.
    파일이나 디렉터리 이름에 공백(대부분의 최신 파일 시스템에서는 완벽하게 합법적임)이 포함되는 즉시 스크립트가 중단됩니다.
    대신 쉘의 글로빙 기능을 사용하십시오.

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. 항상 변수를 인용하십시오.
    쉘은 공백 문자(공백, 줄 바꿈 등)를 보고 명령 인수 하나가 끝나고 다른 명령 인수가 시작되는 위치를 결정합니다. 다음 예를 고려하십시오.

    filename="foo bar"
    
    touch $filename
    # gets expanded to `touch foo bar`, so it creates two files named "foo" and "bar"
    
    touch "$filename"
    # gets expanded to `touch "foo bar`", so it creates a single file named "foo bar"
    
  3. 너무 cd많다

    cd $1/$i       
    counting $i
    
    # which in turn calls ...
    ls -a $1
    

    ls./foo/bar/bar-구문 분석 및 인용되지 않은 변수는 제쳐두고, 이것은 당신이 가진 모든 것이 있을 때 디렉토리의 내용을 나열하려고 시도합니다 ./foo/bar.

관련 정보