#!/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 中。)