“touch”与“find -newer”组合在脚本中表现出意外

“touch”与“find -newer”组合在脚本中表现出意外

目标

我一直在寻找一种简单的方法来检查新文件。

由于目标系统是一个最小的嵌入式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>
...

我尝试过的

  1. 我添加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
  1. 使用touch -a $REFERENCE_FILEtouch -m $REFERENCE_FILE
  2. 将文件权限调整为 666 或 777,以确保 600 不是问题。

什么有效

我可以完全删除并重新创建 REFERENCE_FILE。

rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"

问题

我不明白为什么stat显示更新时间并且脚本不能按预期工作,但随后会按预期touch从我的 CLI 中做出反应。

为什么它会这样?

相关内容