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

유닉스에서 재귀 함수 호출을 만드는 방법
#!/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".
  • 취소 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에서) 사용하거나 전체 함수를 배치하거나 하위 쉘에서 호출하여 항상 절대 경로 이름을 사용하여 이 문제를 해결하십시오 .

관련 정보