파일이 수정되었는지 확인 원한다는 것입니다. 예를 들어, 파일 크기,

Linux (현재 ext4 파일 시스템을 사용)에서 파일 내용을 읽지 않고 파일 내용이 수정되었는지 어떻게 빨리 확인할 수 있습니까?

는 IS stat명령은 권장되는 방법? 나는 현재

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

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

내 느낌은 더 많은 매개 변수를 더 확실하게 던지기를 원한다는 것입니다. 예를 들어, 파일 크기, 파일 이름 등을 추가하면 파일의 “지문”이 더 향상됩니까?

이 주제에서는 TrueCrypt가 메타 데이터 변경을 남기지 않았기 때문에 증분 백업 프로그램에서 한 번 TrueCrypt 볼륨을 항상 무시했음을 상기합니다. 에 의해 반환 된 모든 데이터를 실제로 변경할 수 있다고 가정 stat하여 파일의 가능한 모든 수정 사항을 선택할 수 있다고 생각 하지 않습니까?



답변

파일이 정상적인 방법 (일부 응용 프로그램에서 편집, 수정 제어 시스템에서 새 버전 확인, 재 빌드 등)을 통해 수정되었는지 여부를 확인하려면 수정 시간 (mtime)이 다음에서 변경되었는지 확인하십시오. 마지막 확인. 그것이 stat -c %Y보고하는 것입니다.

touch명령 으로 수정 시간을 설정할 수 있습니다 . 파일의 사용 touch, 아카이브 추출 등을 포함하여 파일이 변경 되었는지 여부를 확인하려면 마지막 확인에서 inode 변경 시간 ( ctime )이 변경되었는지 확인하십시오. 그것이 stat -c %Z보고하는 것입니다. ctime은 시스템 관리자가 아닌 경우에도 스푸핑 할 수 없습니다 (시스템 클럭을 변경하거나 디스크에 직접 액세스하여 파일 시스템을 우회하여 간접적 인 방법으로 만 가능).


답변

stat 명령의 해상도는 1 초입니다. 따라서 파일이 같은 초에 두 번 수정 된 경우 수정 사항을 놓칠 수 있습니다. ext4와 같은 최신 파일 시스템은 나노초 단위로 더 높은 해상도 타임 스탬프를 제공하지만 이전 도구 중 일부는 아직 따라 잡지 않았습니다.

또한 다른 프로그램이 임의의 수정 시간을 설정할 수도 있습니다. touch 명령을 통해 이러한 상황이 어떻게 발생하는지 확인할 수 있습니다.

이 두 가지 가능성 중 하나에 대해 걱정한다면 파일 크기를 보는 것도 좋지 않습니다. 이것이 rsync가 수정 된 파일을 찾을 때 수행하는 작업입니다.


답변

내 느낌은 더 많은 매개 변수를 더 확실하게 던지기를 원한다는 것입니다.

당신이 가진 것은 올바른 방법입니다. 실패한 유일한 이유는 파일 시스템이 제대로 업데이트되지 않는 경우입니다.이 경우 더 심각한 문제가 발생할 수 있습니다.

물론, 파티션에 액세스 할 수있는 시스템에 대한 올바른 지식과 루트 액세스 권한을 가진 사람 이 파일이 변경되지 않은 것처럼 보이 도록 정보를 변경할 수 있다고 가정합니다. 그러나이 경우 크기 등으로도 똑같이해야합니다.


답변

지문을 더 자세하게 만듭니다.

MacOS / BSD 및 GNU 버전 모두에 대해 동일한 출력을 생성하는 작은 래퍼 기능을 만들었습니다 stat(또한 g접두사로 Homebrew 설치 버전을 감지합니다 ).

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호출되며 감지 오버 헤드없이 반복적으로 호출 할 수 있습니다.