표적
나는 새 파일을 확인하는 쉬운 방법을 찾고 있었습니다.
대상 시스템은 최소한의 임베디드 Linux 플랫폼이므로 더 많은 패키지를 설치할 수는 없습니다.
현재 솔루션
좋은 해결책은 find ... -newer reference.file
ing 을 사용 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>
...
내가 시도한 것
- 각 반복을 추가
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
- 사용
touch -a $REFERENCE_FILE
및touch -m $REFERENCE_FILE
- 600이 문제가 되지 않도록 파일 권한을 666 또는 777로 조정합니다.
무슨 일이 일어나는지
REFERENCE_FILE을 완전히 삭제하고 다시 만들 수 있습니다.
rm "$REFERENCE_FILE"
touch "$REFERENCE_FILE"
질문
stat
업데이트된 시간이 표시되고 스크립트가 예상대로 작동하지 않는 이유를 이해할 수 없지만 touch
내 CLI에서는 예상대로 반응합니다.
왜 이런가요?