如何在unix中创建递归函数调用

如何在unix中创建递归函数调用
#!/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 * ...)。这似乎会在递归遍历期间跳过目录树的所有其他级别。对文件进行一次迭代就足够了
  • 我认为在递归调用该函数时不需要使用子shell(在 中存在反引号命令替换`checking() $d`)。如果您需要函数调用的每个实例的本地变量,这可能很有用,但许多 shell 可以直接执行此操作(local在 Bash 中使用,显然是typeset在 ksh93 中
  • 当然还有调用函数的语法:假设hi() { echo "hello $1"; }我们像任何其他命令一样运行它,只需使用hi "$name".
  • 我们可以取消awk并使用 shell 的参数扩展选择文件扩展名。 (但当文件名中没有点时,请检查边界大小写。)或者使用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 中),或者将整个函数或对它的调用放在子 shell 中。)

相关内容