유닉스에서 재귀 함수 호출을 만드는 방법

유닉스에서 재귀 함수 호출을 만드는 방법
#!/bin/sh
checking()
{
  cd "$1"
  for D in *;do
    if [ -d "$D" ]; then
      cd "$D"
      for d in *;do
        echo "$d"
        if [ -d "$d" ]
        then
           `checking() $d`
        fi
        if [ -f "$d" ]
        then
                file_name=`echo "$d" | cut -d'.' -f1`
                echo $file_name
                file_ext=$(echo $d |awk -F . '{if (NF>1) {print $NF}}')
                echo $file_ext
                if [ $file_ext = bin ]
                then
                        strings $d > $file_name.txt
                        mv $file_name.txt /somepath
                fi
        fi

      done
      cd ..

    fi
  done
}

a=$(pwd)
checking() $a

세션 로그 바이너리 파일을 텍스트 파일로 변환하고 문자열 기능을 사용하여 일부 경로에 저장하고 있습니다. 모든 디렉토리에 대해 잘 수행되지만 존재하는 하위 디렉토리에 대한 바이너리 파일을 확인하지 않습니다.

재귀 함수 호출을 사용해 보았으나 해당 호출이 실행되지 않습니다. 도와주세요.

답변1

귀하의 기능에서 몇 가지 사항을 확인했습니다.

  • 디렉토리로 변경한 다음 파일을 반복하고 두 가지를 모두 수행합니다.다시( cd; for d in *; do cd; for d in * ...). 이는 재귀 탐색 중에 디렉터리 트리의 다른 모든 수준을 건너뛰는 것처럼 보입니다. 파일을 한 번만 반복하면 충분합니다.
  • 함수를 재귀적으로 호출할 때 하위 쉘을 사용할 필요가 없다고 생각합니다( 에 백틱 명령 대체가 있습니다 `checking() $d`). 이는 함수 호출의 각 인스턴스에 로컬 변수가 필요한 경우 유용할 수 있지만 많은 쉘에서는 이를 직접 수행할 수 있습니다( localBash에서 사용,분명히 typesetksh93에서)
  • 그리고 물론 함수를 호출하는 구문은 다음 hi() { echo "hello $1"; }과 같습니다. 다른 명령처럼 간단히 hi "$name".
  • 우리는 nix를 사용 awk하고 쉘을 사용할 수 있습니다매개변수 확장파일 확장자를 선택합니다. (단, 파일 이름에 점이 없는 경우 경계선 대소문자를 확인하십시오.) 또는 다음을 사용하십시오.case "$f" in *.bin) ...

다음은 디렉토리 트리를 탐색하는 간단한 함수입니다.

#!/bin/sh

walk() {
        cd "$1"
        for f in *; do 
                if [ -d "$f" ] ; then
                        echo descending into "$f"...
                        walk "$f"
                else
                        ext=${f##*.}
                        if [ "$ext" = "bin" ] ; then
                                echo "found .bin file: $f"
                        fi
                fi

        done
        cd ..
}

walk .

(그러나 cd "$dir"; ... ; cd ..프로그램이 해당 디렉토리를 처리하는 순간 누군가 디렉토리를 이동하면 구조가 문제를 일으킬 수 있다는 점에 유의하십시오. 링크는 ..변경되고 이를 통해 돌아오는 것은 원래 트리 외부에 있을 수도 있는 새 위치에서 계속됩니다. 항상 절대 경로 이름을 사용하거나 pushd/popd(Bash에서) 사용하거나, 전체 함수나 호출을 하위 쉘에 넣어서 이 문제를 해결할 수 있습니다.)

관련 정보