"find -newer"와 결합된 "touch"가 스크립트에서 예기치 않게 작동합니다.

"find -newer"와 결합된 "touch"가 스크립트에서 예기치 않게 작동합니다.

표적

나는 새 파일을 확인하는 쉬운 방법을 찾고 있었습니다.

대상 시스템은 최소한의 임베디드 Linux 플랫폼이므로 더 많은 패키지를 설치할 수는 없습니다.

현재 솔루션

좋은 해결책은 find ... -newer reference.fileing 을 사용 touch하여 반복적으로 실행하는 것 같습니다.참조 문서각 실행에서는 다음과 같습니다. 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>
...

그러나 스크립트가 실행되는 동안 외부, 즉 CLI에서 REFERENCE_FILE을 터치하면 예상한 효과가 나타납니다.

--
--
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번(생성 날짜를 제외한 모든 시간)이 올바르게 업데이트되는 것을 볼 수 있습니다.

CLI에서 REFERENCE_FILE을 업데이트할 때 확인 했는데 stat아무런 차이가 없습니다.

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. 600이 문제가 되지 않도록 파일 권한을 666 또는 777로 조정합니다.

무슨 일이 일어나는지

REFERENCE_FILE을 완전히 삭제하고 다시 만들 수 있습니다.

rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"

질문

stat업데이트된 시간이 표시되고 스크립트가 예상대로 작동하지 않는 이유를 이해할 수 없지만 touch내 CLI에서는 예상대로 반응합니다.

왜 이런가요?

관련 정보