Linux 명령을 사용하여 생성된 파일 시간과 날짜를 수정하는 다른 방법은 무엇입니까? [폐쇄]

Linux 명령을 사용하여 생성된 파일 시간과 날짜를 수정하는 다른 방법은 무엇입니까? [폐쇄]

이것은 Linux 명령을 사용하여 만든 파일입니다.

touch tmp.txt

이제 날짜와 시간을 바꾸려고 합니다. 그래서 내가 하는 일은 다음과 같습니다.

ls -l tmp.txt
-rwrx-rx-x 1 yush guest 600 jul 10 16:58 tmp.txt

위에서 생성된 파일의 연도를 바꾸려면 다음 명령을 사용합니까?

touch -d "1 year ago" tmp.txt

지금,

ls -l tmp.txt 
-rwxr-xr-x 1 yush guest 600 jul 10 2016 tmp.txt

제 질문은 Linux를 사용하여 위 작업을 수행하는 다른 명령이 있습니까?

답변1

액세스 및 수정 시간을 명시적으로 설정합니다.

# touch -t [[CC]YY]MMDDhhmm[.SS]

예를 들어

# touch -t 201212101830.55 tmp.txt
# touch -d "2012-10-19 12:12:12.000000000 +0530" tmp.txt
# touch -d "2017-10-19 14:59:12" tmp.txt

다른 파일의 타임스탬프를 사용할 수 있습니다.

# touch -r file1.txt file2.txt

답변2

이 작업을 수행하려면 아카이버를 사용할 수 있습니다(깨끗하거나 쉽지는 않지만). 실제 파일(파일 시스템 내)의 메타데이터(권한 모드, 소유자, 그룹, 수정 날짜/시간 등)는 inode(예: "시스템 데이터")에 저장되지만 파일의 메타데이터는보관됨파일은 사용자 데이터로 아카이브 파일에 저장됩니다. 이는 일반적으로 조작할 수 있지만 난이도는 다양합니다.

예를 들어 보겠습니다 . cpio다른 보관 프로그램(예: , , , home 등)을 사용하여 ar비슷한 효과를 얻을 수 있습니다 . 먼저, 알려진 수정 날짜/시간(재현성을 위해)을 사용하여 파일을 만든 tar다음 해당 파일만 포함하는 cpio 아카이브를 만듭니다. 옵션에는 다음이 포함됩니다.paxziptmp.txtcpioocpio출력( 아카이브가 기록될 것임을 의미 )하고 c이식 가능한(호환) 형식을 사용하면 작동하기가 더 쉬울 수 있습니다.

$ touch -d "2017년 7월 12일 00:00" tmp.txt

$ ls -l tmp.txt
-rw-r--r-- 1내 사용자 이름 내 그룹 이름  0 7월 12일 00:00 tmp.txt

$ 에코 tmp.txt -oc > tmp.cpio |
1 조각

아카이브를 확인하세요.  cpio -itv파일을 읽는 것을 의미합니다 (입력)을 생성하고V엘보스가능한 콘텐츠.

$ cpio -itv < tmp.cpio
-rw-r--r-- 1내 사용자 이름 내 그룹 이름  0 7월 12일 00:00 tmp.txt
1 조각

$ cattmp.cpio
070701000595CC000081A4000303E900030201000000015965668000000000000068E70000C36100
000000000000000000000800000000tmp.txt07070100000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000B00000000 트레일러! ! !

리버스 엔지니어링을 통해(아마 어딘가에 문서화되어 있을 것입니다. 확인하지는 않았습니다) 아카이브에 있는 첫 번째 파일의 수정된 날짜/시간이 1월 1일 이후 Unix 시간(초 수를 나타내는 32비트 정수)으로 저장되어 있음을 발견했습니다. , 1970 00: 00 GMT 이후) 형식은 문자 위치 47-54의 8자리 16진수입니다. 위의 값을 강조 표시했습니다 59656680. 8자리 16진수 형식의 Unix 시간이라는 것을 알면 찾기가 어렵지 않습니다. 당신은 얻을 수 있습니다현재의unix time(decimal) 명령을 사용하면 date +%s다음과 같이 16진수로 가져올 수 있습니다.

(date +%s; echo "16op") | dc

이제 메타데이터를 수정하세요! 원하는 편집기를 사용하여 아카이브를 편집합니다.

$ vi tmp.cpio
0707010005807C000081A4000303E900030201000000015965668000000000000068E70000C36100
000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000
00000000100000000000000000000000000000000000000000000000000000B00000000 트레일러
!!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@
~
~
~
~
~
"tmp.cpio" [마지막 줄 불완전] 1줄, 512자

무엇으로 바꾸고 싶은지 알아보세요. 귀하의 질문에서 시계를 1년 전으로 되돌린다고 말씀하셨습니다. 그러면 정상적인 365일 1년의 초 수는 365×24×60×60 = 31536000(십진수) = 1E13380(16진수)입니다. 따라서 59656680−1E13380을 빼면 결과는 57843300입니다. 파일에서 변경합니다.

0707010005807C000081A4000303E900030201000000015784330000000000000068E70000C36100
000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000
00000000100000000000000000000000000000000000000000000000000000B00000000 트레일러
!!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@
~
~
~
~
~
"tmp.cpio" [마지막 줄 불완전] 1줄, 512자

저장 및 종료. 변경사항을 확인하세요.

$ cattmp.cpio
070701000595CC000081A4000303E900030201000000015784330000000000000068E70000C36100
000000000000000000000800000000tmp.txt07070100000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000B00000000 트레일러! ! !

$ cpio -itv < tmp.cpio
-rw-r--r-- 1내 사용자 이름 내 그룹 이름  2012년 7월 0일  2016년tmp.txt
1 조각

$ cpio -imuv < tmp.cpio
tmp.txt
1 조각

$ ls -l tmp.txt
-rw-r--r-- 1내 사용자 이름 내 그룹 이름  2012년 7월 0일  2016년tmp.txt

보라, 파일의 수정 날짜/시간을 변경했습니다. ( 아카이브를 읽지 않고 파일을 추출 cpio -i하지 않습니다 . 복원t-m산화시간 -u;nconditional(이 옵션 이 없으면 cpio새 파일은 평소와 같이 이전 파일로 덮어쓰이지 않습니다.)-vVerbose(표시 파일 이름). )

노트:

  • 와 같은 명령을 사용하여 사람이 읽을 수 있는 날짜에 대한 Unix 날짜(초 등)를 얻을 수 있습니다 date -d "Jan 1, 2001" +%s. 앞서 보여드린 (데스크톱 계산기) 트릭을 사용하여 dc이를 16진수로 변환하세요 .
  • cpio 아카이브 형식에는 널 바이트가 포함되어 있습니다. vi( ) 의 현재 버전은 vim이를 존중하는 것 같습니다(즉, 이를 용인하고 단독으로 두는 것). 이전 버전을 포함한 다른 편집자는 vi해당 파일을 손상시키거나(null 값을 제거하여) 편집을 거부할 수도 있습니다.
  • vi줄바꿈 이외의 문자("[불완전한 마지막 줄]")로 끝나는 cpio 아카이브가 감지되었습니다. 파일을 저장할 때 개행 문자를 추가합니다. 다른 보관 프로그램( 제외 cpio)은 이를 변조로 감지하고 수정된 보관 파일을 거부할 수 있습니다.
  • 다른 아카이브 형식은 메타데이터(예: 수정 날짜/시간)를 바이너리 형식으로 저장하거나 체크섬을 가질 수 있습니다. 이러한 파일을 편집하는 것은 제가 여기서 설명하는 것보다 더 어려울 수 있습니다.

관련 정보