파일이 수정되었는지 확인

파일이 수정되었는지 확인

Linux(현재 ext4 파일 시스템 사용)에서 파일 내용이 수정되었는지 빠르게 확인하는 방법아니요읽어보셨나요?

stat명령이 권장되는 접근 방식입니까? 나는 현재

$ stat --format "%Y" hello.txt

나중에 동일한 명령이 동일한 출력을 생성하는지 확인할 수 있습니다. 그렇다면 hello.txt는 변경되지 않았다고 결론을 내립니다.

내 생각에는 사람들이 더 확실하게 하기 위해 더 많은 매개변수를 입력하고 싶어한다는 것입니다. 예를 들어, 파일 크기, 파일 이름 등을 추가하면 파일의 더 나은 "지문"이 제공됩니까?

이 주제에 관해서는 제가 한 번 가지고 있던 TrueCrypt 볼륨이 증분 백업 절차에서 항상 무시되었다는 것을 기억합니다. 아마도 TrueCrypt가 메타데이터 변경 사항이 남지 않도록 보장했기 때문일 것입니다. 반환된 모든 데이터가 변경될 수 있다는 것이 사실 stat이므로 파일의 가능한 모든 수정이 보장되지는 않습니까?

답변1

파일이 일반적인 방법(일부 응용 프로그램에서 편집, 개정 관리 시스템에서 새 버전 확인, 재구축 등)으로 수정되었는지 감지하려면 수정 시간(mtime)이 변경되었는지 확인하세요. 마지막으로 확인한 이후입니다. 그것이 stat -c %Y보고되고 있는 것입니다.

수정 시간은 명령을 통해 설정할 수 있습니다 touch. 파일이 어떤 방식(사용법 touch, 아카이브 추출 등 포함)으로 변경되었는지 감지하려면 해당 inode 변경 시간(시간)가 마지막 확인 이후 변경되었습니다. 그것이 stat -c %Z보고되고 있는 것입니다. ctime은 시스템 관리자를 제외하고는 스푸핑될 수 없습니다. (그리고 그런 경우에도 시스템 시계를 변경하거나 파일 시스템을 우회하여 디스크에 직접 액세스하는 등 간접적인 방법으로만 가능합니다.)

답변2

stat 명령의 분해능은 단 1초입니다. 따라서 같은 초에 파일이 두 번 수정되면 수정 내용을 놓칠 수 있습니다. ext4와 같은 최신 파일 시스템은 나노초 범위의 더 높은 해상도 타임스탬프를 제공하지만 일부 오래된 도구는 아직 따라잡지 못했습니다.

또한 다른 프로그램에서는 임의의 수정 시간을 설정할 수 있습니다. touch 명령을 사용하면 이것이 어떻게 발생하는지 확인할 수 있습니다.

이러한 가능성 중 하나가 걱정된다면 파일 크기를 확인하는 것도 나쁘지 않습니다. 이것이 수정된 파일을 찾을 때 rsync가 수행하는 작업입니다.

답변3

내 생각에는 사람들이 더 확실하게 하기 위해 더 많은 매개변수를 입력하고 싶어한다는 것입니다.

당신이 가진 것은 올바른 접근 방식입니다. 실패한 유일한 이유는 파일 시스템이 제대로 업데이트되지 않았기 때문입니다. 이 경우 더 심각한 문제가 많이 발생하게 됩니다.

물론 저는 파티션에 액세스할 수 있는 시스템에 대한 올바른 지식과 루트 액세스 권한을 가진 누군가가 이를 가능하게 하기 위해 정보를 변경할 수 있다고 가정합니다.바라보다파일이 변경되지 않은 것 같습니다. 그러나 이 경우 치수 등도 동일하게 수행해야 합니다.

답변4

지문을 좀 더 자세히 그려봤습니다.

저는 MacOS/BSD와 GNU 버전 모두에 대해 동일한 출력을 생성하는 작은 래퍼 함수를 ​​만들었습니다 stat(또한 접두사가 붙은 Homebrew 설치 버전도 감지합니다 g).

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

init함수는 스크립트 초기화 중에 한 번 호출되며 getFileStatus계측 오버헤드 없이 반복적으로 호출할 수 있습니다.

관련 정보