거대한 타르볼에서 파일을 추출하지만 두 타임스탬프 사이에서만 생성됩니다.

거대한 타르볼에서 파일을 추출하지만 두 타임스탬프 사이에서만 생성됩니다.

2024-02-19 01:00:00과 2024-02-19 02:00:00 사이에 거대한 tarball에서 생성된 파일의 압축을 풀고 싶습니다.

tar에서는 find를 실행할 수 없기 때문에 tar와 find 명령을 어떻게 결합해야 하는지 모르겠습니다.

도와주셔서 감사합니다, 앤드류

답변1

에서star 구현tar힐리 도구쉘에 있는 것과 동일한 내장된 것이 있거나 find둘 다 schilytools에도 있지만 schilytools에서는 풀 모드에서 사용될 때 술어가 아카이브 구성원의 속성에 적용될 수 있습니다. 파일 시스템의 파일보다sfindfindboshstarx

이는 BSD 조건자도 find지원합니다 -newerXY.

그래서:

star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00

이 범위 내에서 기록 수정 시간이 있는 아카이브 구성원이 추출됩니다.

GNU 도구( tar때때로 호출되지만 gtar일반적으로 tarGNU 시스템에서 GNU 포함)의 경우 한 가지 접근 방식은 이를 사용하여 --to-command아카이브 멤버를 일부 명령으로 파이프하는 것일 수 있습니다. 여기서 멤버의 수정 시간은 환경 변수에서 사용할 수 있습니다 TAR_MTIME.

START=$(date -d 2024-02-19T01:00:00 +%s) \
  END=$(date -d 2024-02-19T02:00:00 +%s) \
  tar -xf file.tar --to-command='
    if
      [ "$TAR_MTIME" -ge "$START" ] &&
        [ "$TAR_MTIME" -le "$END" ]
    then
      mkdir -p -- "$(dirname -- "$TAR_FILENAME")" &&
        cat > "$TAR_FILENAME" &&
        touch -d "@$TAR_MTIME" -- "$TAR_FILENAME"
    fi'

일반 파일만 추출하고(아카이브에 동일한 파일에 대한 하드 링크가 여러 개 있는 경우 첫 번째 발생) mtime을 제외한 어떤 메타데이터도 보존하지 않습니다 touch.

답변2

이것은 약간의 조정을 통해 대부분의 Unix 서버에서 작동할 수 있는 임시 스크립트입니다. 파일 이름의 줄 바꿈이나 사용자 및 그룹 이름의 공백과 같은 일부 특이한 이름은 지원하지 않으므로 데이터를 확인하십시오. 출력을 필터링하여 작동합니다 tar -tv.

tar -tvf a.tar | perl -l -ne 's/-([^ ]* +){3}(2024-02-19 01:[0-9][0-9])(:[0-9][0-9])? // or next; s/[\t \x22\x27\\]/\\$&/g; print' >file-list.txt
<file-list.txt xargs tar -xvf a.tar

원하는 시간 간격과 일치하는 부분은 입니다 2024-02-19 01:[0-9][0-9]. Perl이 없다면 sed나 awk를 사용할 수 있습니다. tar마음에 들지 않으면 시도해 tar -tvf FILENAME보거나 tar tvf FILENAME필요한 변형을 시도하십시오 tar.

tar출력 형식이 다른 경우 필터를 조정해야 할 수도 있습니다. 위 필터는 GNU tar 및 BusyBox에 적용됩니다. BSD tar를 사용하면 사용자 및 그룹 이름이 공백으로 구분되고 최근 몇 달 동안 다르게 표시되므로 몇 가지 조정이 필요합니다.

tar -tvf a.tar | perl -l -ne 's/-([^ ]* +){5}(Feb 19 01:[0-9][0-9])(:[0-9][0-9])? // or next; s/[\t \x22\x27\\]/\\$&/g; print' >file-list.txt

관련 정보