참조를 사용하여 많은 파일의 마지막 수정 날짜 변경

참조를 사용하여 많은 파일의 마지막 수정 날짜 변경

백업을 수행하고 복원했는데 불행하게도 모든 파일 액세스 시간이 복원 프로세스 날짜/시간의 타임스탬프로 설정되어 있습니다. 이제 /mount/backup/user폴더 디렉터리 구조가 동일한 백업(예:)의 모든 타임스탬프를 현재 시스템( /home/user)에 설정할 수 있지만 백업 이후 변경되지 않은 파일에 대해서만 설정할 수 있습니까? (2021년 1월 11일 기준)

뭔가로만지다참조 옵션?

$ man touch
-r, --reference=FILE
              use this file's times instead of the current time

답변1

이와 같은 복잡한 선언이 작동하는 것 같습니다.

find . -mtime +225 -exec sh -c 'echo "\n" && echo File = "{}"; bkf="/mount/backup/{}"; echo Backupfile = \""${bkf}"\" . ; test -f "$bkf" && echo do the touch && echo okok ; echo end' \;

여기서 225는 지금부터 백업까지의 일수입니다(어쨌든 반올림됨).인용하다)

find설명이 아주 exec좋습니다여기

편집하다: 당신이 가지고 있다면tar/tar.gz 아카이브를 사용하여 백업, 모든 파일을 추출할 필요는 없지만 cd백업하고 다음 명령을 실행하면 됩니다(참조: tar 내용 나열) 백업의 모든 파일에 대한 메타데이터를 가져옵니다.

for f in *.tar.gz ; do echo $f; tar -v -t -f $f > "/tmp/contents_backup-20200401/$f.txt"; done

(gzip 압축 아카이브에도 -z 옵션이 필요하지 않은 이유는 확실하지 않습니다)

데이터는 ASCII 테이블 형식이며 공백으로 구분됩니다. 불행하게도 cut가변 간격으로는 작동할 수 없습니다.awk 할 수 있는.

다음 프로세스는 원활하게 실행됩니다(달러, 아포스트로피 또는 괄호가 포함된 일부 보기 흉한 파일 이름 제외). 이는 를 사용하여 부분적으로 수정할 수 있지만 실제로 fgrep파일 이름에 달러 기호나 아포스트로피가 포함된 경우 grepfind의 출력도 제거됩니다 .{}

라이브 시스템의 폴더로 이동한 후 다음을 수행합니다.

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; timestamp=$(fgrep "{}" /tmp/contents_backup-20200401/backup-musik.tar.gz.txt  | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"" . ; test -n "$timestamp" && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;

따라서:

  • 244백업 이후의 일수입니다(첫 번째 필터로).
  • 2020-07-10하드코딩된 날짜이므로 해당 날짜의 파일만 영향을 받습니다.
  • /tmp/contents_backup-20200401/backup-musik.tar.gz.txt위 명령으로 생성된 파일입니다.

이 명령의 기능은 다음과 같습니다.

  • 라이브 시스템의 파일을 반복합니다.
  • 잘못된 날짜 문제의 영향을 받았는지 확인합니다(오래되었고 백업 이후 변경되지 않았으므로 타임스탬프를 재설정하고 싶지 않음).
  • 백업 목록에서 해당 항목을 찾아 찾습니다. (안타깝게도 폴더에 많은 파일이 있으므로 폴더*에서는 작동하지 않습니다.)
  • 다음을 사용하여 awk백업 파일의 타임스탬프를 가져옵니다.
  • 보고 성공

*) 폴더 날짜 및 시간은 다음을 사용하여 설정할 수 있습니다.이 명령해당 폴더의 최신 파일을 기반으로 합니다(실제로 이는 모든 폴더에 반복적으로 적용되어야 함).

stat -c %y . && touch -r "$(find -mindepth 1 -maxdepth 1 -printf '%T+=%p\n' | sort |tail -n 1 | cut -d= -f2-)" . && stat -c %y .

편집 2: 탈출(단일 아포스트로피) 올바른 구문을 사용하는 것이 때로는 어려울 수 있습니다.

편집 3: 이 명령은 모든 하위 폴더에서 실행될 수 있으며, 이로 인해 백업 조회에서 고유하지 않은 일치 항목이 발생할 수 있으므로 이 내용도 보고됩니다.

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; filelist=$(fgrep "{}" /tmp/contents_backup-20200401/backup-dokumente.tar.gz.txt); filecount=$(echo "$filelist"|wc -l); echo "file count = $filecount"; [ "$filecount" -gt "1" ] && echo "multiple files found" ; timestamp=$(echo "$filelist" | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"" . ; [ $(echo -n "$timestamp" | wc -m) = 16 ] && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;

관련 정보