파일/디렉토리의 백업 및 복원을 위한 타임스탬프?

파일/디렉토리의 백업 및 복원을 위한 타임스탬프?

파일과 디렉터리의 a/c/m타임 스탬프를 백업하고 필요한 경우 복원할 수 있어야 합니다.

백업 명령의 예는 다음과 같습니다.

$ timestamp backup --all-stamps --incl-dir-stamps --recursive out.stampbak file.bin /dir/with/files/

복구는 다음과 같습니다.

$ timestamp restore --all-stamps out.stampbak

내가 원하는 결과를 얻기 위해 그러한 명령이 존재합니까? 대부분의 파일 시스템이 나노초 단위로 멈춰 있다고 생각하지만 나노초 정밀도나 기타 더 미세한 정밀도가 선호됩니다. 백업/복원을 위해 BSD 및 GNU/Linux 시스템에 타임스탬프가 필요하므로 POSIX 준수도 중요합니다.


편집하다:몇 가지 사항을 명확히 하기 위해 내가 나열한 파일 시스템은 대부분 파일을 유지합니다.현재마침내 기본 ZFS 서버로 이동할 수 있을 때까지 말이죠. 이것이 우리가 타임스탬프를 유지할 가능성을 고려하게 만드는 이유입니다.앞으로데이터를 ZFS로 마이그레이션합니다. 전송 중에 스탬프가 변경되는 경우(HTTP, FTP, SMB 등과 같은 다양한 방법을 사용함), 원래대로 복원될 수 있는지 확인하고 싶습니다. 전송 후에도 타임스탬프를 작은 백업으로 유지하는 것이 유익하므로 파일이 ZFS에 저장될 때마다 타임스탬프를 지원/복구하는 문제만 남아 있습니다. 백업 시 권한 및 그룹 정보를 생략할 수 있습니다.

백업 타임스탬프에 사용되는 운영 체제에는 macOS Mojave 10.14.6, Ubuntu Server 18.04.5 LTS, Debian 10.2/7.8, FreeBSD 12.2 및 CentOS 8이 포함됩니다. 복구는 주로 FreeBSD(ZFS 서버 호스트)에서 수행되며 다른 곳에서는 필요하지 않을 것 같습니다. 도움이 된다면 NTFS 파티션에 파일이 있는 드라이브가 여러 개 있습니다. 이러한 타임스탬프를 올바르게 백업하려면 작은 Windows 인스턴스를 실행해야 합니까?

또한 대부분의 파일 시스템은 atime, ctime 및 mtime을 사용하고 다른 파일 시스템은 사용하지 않는다는 인상을 받았습니다(결국 파일 시스템마다 다르다고 생각합니다). 제 목표는 가능하다면 모두 저장하고 복원하는 것입니다.

도구가 어느 플랫폼에서나 사용될 수 있기 때문에 POSIX 준수를 언급했습니다. 이전 설명이 부정확하거나 부적절했다면 사과드립니다. 나는 또한 ctime = 생성/생성 시간이라고 생각했는데, 이제 변경 시간인 것을 알 수 있습니다.

유지해야 할 가장 중요한 타임스탬프는 생성/생성 시간 및 수정 시간입니다. 액세스 시간도 좋으며 시간 변경은 덜 중요하지만 여전히 도움이 됩니다. 다시 한 번 실수에 대해 사과드립니다. 아직 배우는 중입니다.


편집 2:~에서이 기사나는 이것을 배웠다:

  • 파일 생성 타임스탬프는 대부분의 파일 시스템에서 보존되지 않습니다. 이는 "특정 날짜에 생성된 모든 파일 표시"와 같은 명령을 실행할 수 없음을 의미합니다. 즉, 일반적으로 ctime과 mtime에서 동일한 결과를 추론할 수 있습니다(일치하는 경우 - 이는 아마도 파일 생성 시간을 의미함).

  • 새 파일이나 디렉터리를 생성할 때 일반적으로 세 가지 시간(atime, ctime 및 mtime)이 모두 현재 시간을 캡처하도록 구성됩니다.

대상 파일 시스템은 파일/디렉터리의 타임스탬프가 복원되는 ZFS가 될 것이므로 타임스탬프를 저장하는 파일 시스템이 생성 시간을 저장하지 않는 경우를 대비하여 최소한 atime, ctime, mtime을 저장하는 것이 좋습니다.

답변1

GNU find와 Perl을 사용할 수 있다면 이를 사용하여 무언가를 조합할 수 있습니다. -printfto 액션은 find타임스탬프를 인쇄할 수 있고 Perl은 utime타임스탬프를 수정하는 기능을 가지고 있습니다. 또는 두 개, 하나는 내장되어 있고 다른 하나는 Time::HiRes 모듈에 있으며, 후자는 1초 미만의 정확도를 지원합니다.

테스트용 일부 파일:

$ find . -printf '%A@ %T@ %p\n'
1631866504.4180281370 1631866763.5380257720 .
1631866763.5380257720 1631866768.2101700800 ./dir
1631866768.2101700800 1631866768.2101700800 ./dir/bar.txt
1631866760.2619245850 1631866760.2619245850 ./foo.txt

타임스탬프를 파일에 저장:

$ find . -printf '%A@ %T@ %p\0' > ../times

타임스탬프를 삭제해 보겠습니다.

$ touch -d 1999-01-01 **/*
$ find . -printf '%A@ %T@ %p\n'
1631866771.6022748540 1631866763.5380257720 .
915141600.0000000000 915141600.0000000000 ./dir
915141600.0000000000 915141600.0000000000 ./dir/bar.txt
915141600.0000000000 915141600.0000000000 ./foo.txt

파일에서 다시 로드합니다.

$ perl -MTime::HiRes=utime -0 -ne 'chomp; my ($atime, $mtime, $file) = split(/ /, $_, 3); utime $atime, $mtime, $file;'    < ../times
1631866771.6022748950 1631866763.5380258560 .
1631866771.6022748950 1631866768.2101700310 ./dir
1631866768.2101700310 1631866768.2101700310 ./dir/bar.txt
1631866760.2619245050 1631866760.2619245050 ./foo.txt

utime파일에는 각 값 세트에 대한 Perl 스니펫 호출 과 함께 atime, mtime 및 파일 이름과 함께 NUL 종료 필드만 포함됩니다 .

NUL을 종결자로 사용하면 임의의 파일 이름을 처리할 수 있어야 하지만 \n여기서 대신 \0출력을 인쇄하기 위해 사용하고 있다는 점에 유의하세요. 이 Perl 조각은 개행 문자가 아닌 NUL을 기대하기 때문에 이 Perl 코드 조각에서는 작동하지 않습니다.

또한, 내가 아는 한 utime()/set 은 어쨌든 사용할 수 없기 때문에 ctime을 완전히 무시했습니다 utimensat(). 모든 출생 타임스탬프에도 동일합니다.

답변2

이전에 논의한 바와 같이, 유사 항목을 설정하는 유일한 방법은 ctime커널 내에서 이루어지며, 사용자 공간 인터페이스는 타당한 이유로 atime타임스탬프를 초과 하는 설정을 허용하지 않습니다 mtime. ctimeand 를 유지하려면 and 를 사용하여 수행 crtime할 수 있지만 이를 위해서는 양쪽에 이미 ZFS가 있어야 합니다.ZFS/sendZFS/receive

당신이 좋아하는 일을 반복하겠습니다.

  • 기존 파일 시스템을 다른 위치로 복사

  • 타임스탬프는 나중에 이 복사를 수행하거나 다른 프로그램을 복원할 때 유지됩니다 atime.mtime

백업/복원 방법을 실행한 다음 타임스탬프를 복원하는 다른 프로그램을 실행하거나 타임스탬프를 올바르게 복원하는 백업/복원 방법을 실행하여 이를 수행할 수 있습니다.

star두 가지 방법 모두에 도움이 될 수 있는 성숙한 백업 도구입니다.

백업 및 복원 파일 시스템(타임스탬프 포함)을 사용하려면 star매뉴얼 페이지를 확인하십시오.http://schilytools.sourceforge.net/man/man1/star.1.html

타임스탬프를 개별적으로 저장하고 복원하려면 백업을 실행하기 전에 타임스탬프를 저장해야 합니다. 백업이 atime모든 파일의 값에 영향을 미칠 가능성이 높기 때문입니다.

  • 디렉터리 트리에 있는 모든 파일의 모든 타임스탬프를 저장하려면 다음을 실행하세요.

    star -c -dump -meta f=timestamparchive.tar .
    
  • 모든 타임스탬프를 새 위치로 복원하려면 다음을 실행하세요.

    star -xU -meta f=timestamparchive.tar
    

첫 번째 명령으로 생성된 아카이브 파일은 약을 사용합니다. 파일당 1.5KB. 두 번째 명령은 이미 아카이브에 존재하는 모든 파일의 모든 타임스탬프를 복원하지만 파일 내용에는 영향을 주지 않습니다.

참고: 저는 "스타"의 저자이며 39년 동안 활동해 왔습니다.

답변3

"ls --full-time" 명령은 파일의 전체 타임스탬프를 제공합니다. 이 타임스탬프는 "awk"를 사용하여 형식을 지정하고 "date"를 사용하여 현재 시간 이름을 딴 파일에 저장할 수 있습니다.

ls --full-time | awk '{print $6"\t"$7"\t"$9}' > timestamps.output.`date +%Y-%m-%d_%k:%M:%S.%N`

이는 비슷한 결과를 낳습니다:

timestamps.output.2021-09-16_16:33:05.363928457:

2021-09-16  16:13:40.988062443  file1
2021-09-16  16:13:45.408053173  file2
2021-09-16  16:13:49.496044596  file3
2021-09-16  16:13:52.628038023  file4

이를 통해 시간 경과에 따른 파일 타임스탬프의 변경 사항을 추적할 수 있습니다. 물론 원하는 대로 타임스탬프 형식을 지정할 수 있습니다.

또한 "git" 저장소를 사용하여 시간 경과에 따른 timestamp.output 파일의 변경 사항을 추적할 수도 있습니다.

관련 정보