目标
我一直在寻找一种简单的方法来检查新文件。
由于目标系统是一个最小的嵌入式Linux平台,我不能只安装更多的软件包。
当前解决方案
一个不错的解决方案似乎是使用find ... -newer reference.file
,然后touch
使用 ing重复运行参考文件在每次运行中,如下所示:
https://unix.stackexchange.com/a/249238/562136
就我而言,代码如下所示:
NEW_FILES=()
WORK_FILE_DIR="/some/folder/path"
REFERENCE_FILE="${WORK_FILE_DIR}/.last_checked_reference"
function find_new_files() {
mapfile -t NEW_FILES < <(find "$WORK_FILE_DIR" -type f -newerBa "$REFERENCE_FILE" -name "*.txt")
touch "$REFERENCE_FILE"
}
mkdir -p $WORK_FILE_DIR
touch $REFERENCE_FILE
while true; do
find_new_files
for file in "${NEW_FILES[@]}"; do
echo "New file $file"
# ... handle file content in multiple steps
done
echo "--"
sleep 5
done
请注意,我实际上使用了-newerBa
而不仅仅是newer
.
预期行为
仅使用-newerBa
文件已创建应列出上次访问 REFERENCE_FILE 后的情况,并在每次访问时更新访问时间touch
。
我期望输出看起来像
--
--
New file <file1>
--
--
--
New file <file2>
...
实际行为
输出如下所示:
--
--
New file <file1>
--
New file <file1>
--
New file <file1>
--
New file <file1>
New file <file2>
--
New file <file1>
New file <file2>
...
但是当我从外部触摸 REFERENCE_FILE 时,即在脚本运行时从我的 CLI 中,触摸具有预期的效果:
--
--
New file <file1>
--
New file <file1>
-- <-- at this point, touch REFERENCE_FILE from my CLI
--
New file <file2>
--
New file <file2>
...
我尝试过的
- 我添加
stat $REFERENCE_FILE
到每次迭代中,可以看到 4 次中的 3 次(除了创建日期之外的所有时间)在脚本运行时都已正确更新。
我stat
在从 CLI 更新 REFERENCE_FILE 时进行了检查,但看不到任何差异。
16777221 96762726 -rw------- 1 user staff 0 0
"Feb 25 11:53:24 2023"
"Feb 25 11:53:24 2023"
"Feb 25 11:53:24 2023"
"Feb 25 01:10:39 2023"
4096 0 0
<path>/.last_checked_reference
--
16777221 96762726 -rw------- 1 user staff 0 0
"Feb 25 11:53:29 2023"
"Feb 25 11:53:29 2023"
"Feb 25 11:53:29 2023"
"Feb 25 01:10:39 2023"
4096 0 0
<path>/.last_checked_reference
- 使用
touch -a $REFERENCE_FILE
和touch -m $REFERENCE_FILE
- 将文件权限调整为 666 或 777,以确保 600 不是问题。
什么有效
我可以完全删除并重新创建 REFERENCE_FILE。
rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"
问题
我不明白为什么stat
显示更新时间并且脚本不能按预期工作,但随后会按预期touch
从我的 CLI 中做出反应。
为什么它会这样?