2024-02-19 01:00:00과 2024-02-19 02:00:00 사이에 거대한 tarball에서 생성된 파일의 압축을 풀고 싶습니다.
tar에서는 find를 실행할 수 없기 때문에 tar와 find 명령을 어떻게 결합해야 하는지 모르겠습니다.
도와주셔서 감사합니다, 앤드류
답변1
에서star
구현tar
힐리 도구쉘에 있는 것과 동일한 내장된 것이 있거나 find
둘 다 schilytools에도 있지만 schilytools에서는 풀 모드에서 사용될 때 술어가 아카이브 구성원의 속성에 적용될 수 있습니다. 파일 시스템의 파일보다sfind
find
bosh
star
x
이는 BSD 조건자도 find
지원합니다 -newerXY
.
그래서:
star xf file.tar -find -newermt 2024-02-19T00:59:59 ! -newermt 2024-02-19T02:00:00
이 범위 내에서 기록 수정 시간이 있는 아카이브 구성원이 추출됩니다.
GNU 도구( tar
때때로 호출되지만 gtar
일반적으로 tar
GNU 시스템에서 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