4개의 파일이 있다고 가정해 보겠습니다.
a.zip created on 28 feb 2018
b.zip created on 28 feb 2018
c.zip created on 2 mar 2018
d.zip created on 2 mar 2018
2월 28일자 파일을 검색해서 tar하고 싶습니다.
find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
그러나 이것은 작동하지 않습니다.
답변1
GNU 또는 FreeBSD find
와 GNU 또는 BSD 의 경우 tar
:
find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
tar -cf file.tar --null -T -
(정확한 나노초 2018-02-28T00:00:00.000000000에 마지막으로 수정된 파일을 제외하고 다음 날의 파일을 포함할 수도 있습니다. 이는 파일이 사용되지 않는 한 나노초 단위의 파일 시스템에서는 거의 발생하지 않습니다. touch -t
/ touch -d
초 미만의 정밀 타임스탬프를 저장하지 않는 아카이브에서 생성되거나 자체적으로 추출됨)
POSIXly 및 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다(표준 tar 아카이브 형식에도 파일 이름에 대한 추가 제한이 있습니다).
touch -d 2018-02-28T00:00:00 .start
touch -d 2018-03-01T00:00:00 .end
find . -type f -newer .start ! -newer .end ! -path ./.start ! -path ./.end |
pax -x ustar -w > file.tar
GNU 도구를 사용하여 (2018년뿐만 아니라) 2월 28일에 모든 일반 파일을 마지막으로 수정하려면 다음을 수행하십시오.
find . -type f -printf '%Tm-%Td-%p\0' |
sed -nz 's/^02-28-//p' |
tar -cf file.tar --null -T -
의 출력은 find -ls
자동으로 안정적으로 사후 처리되지 않으며 사람이 사용할 수 있는 용도로만 만들어졌습니다.
답변2
를 사용하면 star
명령줄은 다음과 같습니다.
touch -t201802280000 ref
star -c -f file.tar -find . -newer ref
참고: -newermt는 libfind
.
종료 날짜도 마음에 드는 경우:
touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find . -newer start ! -newer end
1초를 생략해야 하거나 연도가 윤년인 경우 이틀이 나올 수 있습니다.
2018년은 윤년이 아니므로 를 사용할 수 있습니다 touch -t201803010000 end
.
답변3
귀하의 명령이 작동하지 않는 이유를 추가하고 싶었습니다.
find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
find의 출력은 파일 이름 목록과 날짜와 같은 기타 정보입니다. Grep은 날짜가 일치하는 전체 행을 출력합니다. Tar에는 파일 이름만 필요하며 줄 바꿈 대신 널 바이트로 구분해야 합니다.
답변4
find
가지다날짜옵션. 그거 먹어봤어?
-newermt 마지막 수정 날짜
-마지막 방문 날짜가 최신입니다.
-newerct 권한 변경 마지막 날짜
예를 들어:
find . -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar
편집하다
~처럼찰스 더피이 문제를 방지하려면 댓글을 달아주세요.
find . -newermt 2018-07-10 ! -newermt 2018-7-11 -print0 | xargs -0 tar -cfv file.tar