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

时间:2017-10-09 19:15:41

标签: bash recursion while-loop directory

StackOverflow上的第一篇文章,第一次使用Bash。

我目前正在尝试构建一个函数来读取文件,然后根据状态给我输出:

  • 如果是文件,则打印名称,大小和类型
  • 如果是符号链接,则打印名称及其目标
  • 如果是目录,则递归调用每个项目上的函数。
  • 否则返回'unknown'

我知道代码到目前为止粗糙,但我真正需要帮助的是递归循环部分。如何使用While循环遍历目录的内容?

到目前为止,这是我的代码:

#!/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 个答案:

答案 0 :(得分:3)

没有什么能阻止你递归调用你的函数,如下所示:

fileChecker() {
    # ...
    for f in "$1"/*; do
        fileChecker "$f"
    done
}

这是您的脚本,其中包含一些修复程序(*),其行为如下所述:

#!/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
  • 使用readlink -f进行符号链接目标
  • POSIX-compliance(功能定义)

请注意,for f in "$1"/*不会循环遍历以点开头的文件名(“隐藏文件”)。另请注意[ -e "$f" ] || [ -h "$f" ]之前的fileChecker检查,以防止在"$1"/*上调用它,以防glob不扩展(当dir "$1"中没有文件时)。