Bash Recursive Function Call on all elements in a directory
本问题已经有最佳答案,请猛点这里访问。
第一次发布在stackoverflow上,第一次使用bash。
我目前正在尝试构造一个函数来读取一个文件,然后根据状态给我输出:
- 如果是文件,则打印名称、大小和类型
- 如果它是一个符号链接,那么打印名称和它的目标
- 如果它是一个目录,那么递归地调用每个项上的函数。
- 否则返回"未知"
我知道到目前为止代码还很粗糙,但是我真正需要帮助的是递归循环部分。如何使用while循环遍历目录的内容?
到目前为止,我的代码是:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/bin/bash function fileChecker f { if [-e $1 ]; then if [ -f $1]; then SIZE = 'du -k $1 | cut -f1' CONTENT = 'file $1 | cut -d':' -f2' echo $1 +"" + $SIZE +"" + $CONTENT elif[ -h $1 ]; then LINK = get info from $1 echo $1 +"" +"symbolic link" + $LINK elif [ -d $1 ]; then while [ ???? ]; do fileChecker n do else echo $1 +"unknown" fi fi } |
事先谢谢!
没有什么能阻止你递归地调用你的函数,比如:
1 2 3 4 5 6 | fileChecker() { # ... for f in"$1"/*; do fileChecker"$f" done } |
下面是您的脚本,其中包含一些修复程序(*),其行为如下所述:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/bin/bash fileChecker() { if [ -f"$1" ]; then size=$(du -k"$1" | cut -f1) content=$(file"$1" | cut -d':' -f2) echo"$1 $size $content" elif [ -h"$1" ]; then link=$(readlink -f"$1") echo"$1 symbolic link $link" elif [ -d"$1" ]; then for f in"$1"/*; do [ -e"$f" ] || [ -h"$f" ] && fileChecker"$f" done else echo"$1 unknown" fi } |
(*)修复:
[ 命令前后的正确间距- 变量的正确引用(
"$1" ) - 省略了对文件存在性的冗余检查,因为
-f 已经检查了文件是否存在(并且是常规的) - 使用命令替换
$(cmd ...) 而不是反勾号(更简单、更易读) - 固定在
echo 中的字符串concat - 对symlink目标使用
readlink -f 。 - POSIX遵从性(函数定义)
请注意,