CLI: 파일 수정 시간 백업 및 복원

최근에 git 저장소의 일부로 정확한 파일 수정 시간을 유지해야 했습니다. git은 기본적으로 이러한 기능을 지원하지 않기 때문에 사전 커밋 후크의 일부로 findtouch 명령의 간단한 조합을 사용했습니다.

다음은 이 접근법의 두 가지 버전입니다. 하나는 stat 명령이 있고 다른 하나는 findtouch 의 조합입니다.

첫 번째 버전(통계)




find . -type f -exec stat -c 'touch -d "%y" "%n"' {} \; > restore_mtimes


설명:
  • find 명령을 사용하여 현재 디렉토리( . )에서 시작하여 모든 하위 디렉토리의 모든 파일(-type f)을 재귀적으로 반복합니다.
  • 각 파일에 대해 (-exec 플래그) stat ... 명령(문자열{}이 현재 파일 이름으로 대체됨)
  • 을 실행합니다.
  • stat 명령(-c 플래그)의 형식화된 출력을 사용하여 복원 스크립트의 일부로 touch -d "%y" "%n" 행을 생성합니다("%y"는 수정 시간, "%n"은 파일 이름). .
  • find 명령의 전체 출력을 restore_mtimes 파일
  • 로 리디렉션합니다.

    결과restore_mtimes 파일은 다음과 같습니다.

    touch -d "2022-09-26 15:55:10.127898032 +0200" "./f2"
    touch -d "2022-09-26 15:55:11.651909078 +0200" "./f3"
    touch -d "2022-09-26 15:55:06.751873534 +0200" "./f1"
    


    이 파일을 실행하여 원래 수정 시간을 복원할 수 있습니다(chmod +x restore_mtimes로 실행 가능하게 만들거나 . restore_mtimes로 직접 소싱하여).

    두 번째 버전(찾기 및 터치)



    파일 수정 시간만 필요하므로 불필요한 stat 명령 호출을 제거하고 find 명령에서 제공하는 수정 시간을 사용하여 최적화할 수 있습니다.

    find . -type f -printf 'touch -d "%t" "%p"\n' > restore_mtimes
    


  • "%t"는 수정 시간이고 "%p"는 파일 이름입니다
  • stat -c 와 달리 끝에 개행 문자를 명시적으로 추가해야 합니다
  • .

    find에 의해 반환된 시간 형식은 약간 다릅니다(그러나 touch에 의해 올바르게 구문 분석되어야 합니다).

    touch -d "Mon Sep 26 15:55:10.1278980320 2022" "./f2"
    touch -d "Mon Sep 26 15:55:11.6519090780 2022" "./f3"
    touch -d "Mon Sep 26 15:55:06.7518735340 2022" "./f1"
    



    대안 및 고려해야 할 추가 사항:

    VCS 커밋 시간



    파일 수정 시간 백업에 대한 한 가지 대안은 버전 관리 시스템에서 마지막 커밋 시간을 재사용하는 것입니다(예: restoring file mtimes with git ).

    --no-create 터치



    일부 파일이 삭제될 수 있는 트리에 수정 시간을 복원하려는 경우 --no-create 플래그를 추가하는 것이 유용할 수 있습니다(touch가 새 파일을 만들지 않도록 방지함).



    참고: 이것은 BetterWays.dev wiki 의 위키 페이지 스냅샷입니다. 더 나은 형식의 최신 버전은 betterways.dev/cli-backing-up-and-restoring-file-modification-times 에서 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기