파일 및 디렉터리를 재귀적으로 평가

파일 및 디렉터리를 재귀적으로 평가

다음과 관련해 도움이 필요합니다.

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

재귀 함수를 사용하여 해당 파일과 하위 디렉터리 내의 모든 파일과 디렉터리를 계산하고 싶습니다.

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.

관련 정보