在Bash中递归检查每个文件的属性

时间:2018-08-22 23:10:43

标签: bash shell

我一直试图制作一个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 /中的文件,它可以正常工作,但似乎无法在任何子文件夹中找到(从而检查)文件。我该如何解决?

2 个答案:

答案 0 :(得分:1)

除非另有说明,否则我将假设您正在使用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 

答案 1 :(得分:0)

我将遍历文件树与检查单个文件分开。

首先编写一个脚本,该脚本检查单个文件,如果文件符合您的条件,则将文件名打印到stdout。我们将此脚本称为 check_file 。现在使用例如

find /home/user -type f -exec check_file {} \;