파일이 수정되었는지 확인


10

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

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

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

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

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

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


md5sum filename?
Ramesh

md5sum또는 모든 종류의 체크섬이 파일의 내용을 읽습니다. 내 목적으로는 너무 느리기 때문에 그렇게하고 싶지 않습니다.
DustByte

ls -t디렉토리의 내용을 수정 시간별로 정렬합니다.
ryekayo

"수정되었습니다"? 모든 파일이 수정되었습니다. 문제는 언제 수정되었는지입니다. '찾기'를 사용하여 특정 범위의 수정 시간을 검색 할 수 있습니다.
Ray Andrews

답변:


5

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

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


고마워, 나는 ctime이 내가 사용해야하는 것을 수집합니다. 이 질문의 목적은 체크섬이 새로운 파일이나 변경된 파일에 대해서만 계산되는 자체 백업 스크립트에서 사용한다는 것입니다. "약간"변경된 파일에 대한 계산 체크섬을 감당할 수 있고, 권한이 변경되었다고 말합니다. 변경 내용을 확인하기 위해 파일의 내용을 실제로 보는 것이 가능한 한 가까이있는 것을 선호합니다.
DustByte

3

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

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

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


1

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

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

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


0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.