首页 > 解决方案 > 在 Bash 中递归检查每个文件的属性

问题描述

我一直在尝试制作一个从文件夹(即我的主文件夹)开始的 bash 脚本,然后递归地获取每个文件并检查一些属性。假设我想检查我的文件是否有一定的大小并在其中包含文本(不是二进制数据)。它应该处理隐藏文件或以连字符开头的特殊情况。这就是我想出的:

for i in $(cd "/home/user" && ls -aR);
do
    if [[ $(file ./"$i") == "./\"$i\": ASCII text" ]] && [[ $(du -b ./"$i" | grep -oE "[0-9]+") == "1015" ]]; then
        echo ./"$i"
    fi
done

我不知道有多少子文件夹,我需要它来回显符合条件的文件的路径。它适用于 /home/user/ 中的文件,但它似乎没有找到(并因此检查)任何子文件夹中的文件。我该如何解决这个问题?

标签: bashshell

解决方案


bash除非另有说明,否则我将假设您使用的是4。

shopt -s globstar
for f in /home/user/**/*:
    if [[ $(file -- "$f") != *": ASCII text" ]]; then
        continue
    fi
    # This is the syntax for GNU stat; consult your manual for
    # other implementations
    size=$(stat -c %s -- "$f")
    if (( size != 1015 )); then
        continue
    fi

    echo "$f"
done 

推荐阅读