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



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

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

  • 如果是文件,则打印名称、大小和类型
  • 如果是符号链接,则打印名称及其目标
  • 如果它是一个目录,则在每个项目上递归调用该函数。
  • 否则返回"未知"

我知道到目前为止的代码很粗糙,但我真正需要帮助的是递归循环部分。如何使用 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 
}

提前感谢!

没有什么能

阻止你递归地调用你的函数,就像这样:

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中的字符串连接
  • 对符号链接目标使用 readlink -f
  • POSIX-合规性(功能定义)

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

最新更新