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