关于递归:Bash递归函数调用目录中的所有元素

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遵从性(函数定义)

请注意,for f in"$1"/*不会循环使用以点开头的文件名("隐藏文件")。另外,在调用fileChecker之前,请注意[ -e"$f" ] || [ -h"$f" ]检查,以防止在全局没有展开(dir "$1"中没有文件)的情况下调用"$1"/*