명령 대체를 사용하여 tar.tgz 파일을 만들려고 합니다.
2012년 8월 17일의 백업이 있습니다.
-rw-r----- 1 ossec 502 804M Aug 17 2012 BKPMDISINT_i6nir20j.F_bkp
-rw-r----- 1 ossec 502 2.7G Aug 17 2012 BKPSYFINT_i5nir20j.F_bkp
-rw-r----- 1 ossec 502 3.9G Aug 17 2012 BKPMSFFINT_i4nir20j.F_bkp
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-00
-rw-r----- 1 ossec 502 2.0G Aug 17 2012 ALG_KLPFINT_ianir576.alg
-rw-r----- 1 ossec 502 1.5G Aug 17 2012 ALG_KLPFINT_i8nir576.alg
-rw-r----- 1 ossec 502 37M Aug 17 2012 ALG_KLPINT_ibnir64h.alg
-rw-r----- 1 ossec 502 2.2G Aug 17 2012 ALG_KLPFINT_i9nir576.alg
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-01
-rw-r----- 1 ossec 502 27M Aug 17 2012 ctrl_170803
그래서 나는 그들을 타르해야합니다. 이 명령을 사용했습니다
tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "8월 17일")
하지만 나에게 이런 오류가 발생합니다.
tar: You may not specify more than one `-Acdtrux' option
Try `tar --help' or `tar --usage' for more information.
답변1
이렇게 하면 $(ls -lrth|grep "Aug 17")
파일 이름뿐만 아니라 전체 줄을 인수로 얻게 되므로 tar
작동하지 않습니다. 일반적으로 말하면파싱되지 않음출력 ls
.
상대적으로 새로운 버전의 Gnu find(>= v4.3.3 )가 있는 경우 다음을 수행할 수 있습니다.
find . -maxdepth 1 -newermt 20120817T0000 -not -newermt 20130818T0000 -print0 \
| cpio --create --null --format=ustar \
| gzip > DB-Backup-17082012.tgz
find
이를 지원하지 않는 경우 -newermt
이러한 날짜 타임스탬프를 사용하여 두 개의 파일을 만든 다음 -newer를 사용할 수 있습니다. 물론 그것도 사용할 수 있지만 -daystart -mtime
날짜를 계산해야 합니다(또는 시행 착오를 사용해야 합니다).
내가 제안하는 한 가지는 파일의 날짜를 YYYYMMDD 형식으로 사용하는 것입니다. 첫째, 동일한 문자열(날짜 기준)로 시작하는 파일이 여러 개 있는 경우 두 번째로 파일 이름(6월 5일(유럽) 또는 5월 6일(미국))을 보는 사람에 따라 정렬이 더 좋아집니다. 05062012는 모호합니다. . 따라서 1708년은 8월 17일이 틀림없지만 파일을DB-Backup-20120817.tgz
답변2
너의 길
원하는 대로 할 수 있지만 일부 파일의 이름에 공백이 있을 수 있으므로 위험할 수 있습니다. 그러나 이것은 하나의 접근 방식입니다.
$ tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17"|awk '{print $9}')
이렇게 하면 얻은 다른 모든 열 데이터가 제거되고 ls -lrth
파일 이름만 제공됩니다.
find & tar 사용: 방법 #1
Unix find
명령을 사용하여 특정 날짜에 마지막으로 수정된 모든 파일 목록을 가져오고 해당 목록을 다음 tar
으로 파이프할 수 있습니다.
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 -print0 | \
xargs -0 tar zcvf DB-Backup-17082012.tgz
위 명령은 2012년 8월 17일에 마지막으로 수정된 파일만 찾고 최신 파일은 찾지 않습니다. -print0
null 문자( )를 사용하여 출력 파일을 분할하고 각 파일을 가져온 다음 파일을 일괄 추가하는 호출을 작성하도록 find에 지시합니다 .\0
xargs -0
tar
이는 아마도 가장 성능이 낮은 방법일 것입니다.
노트:tar
또한 이 방법은 명령줄 인수로 명령에 전달할 수 있는 것보다 많은 파일이 있는 경우 파일이 손실될 위험이 있습니다.
find & tar 사용: 방법 #2
-print0
중복되므로 이를 xargs -0
사용하여 find
목록을 생성하고 tar
직접 호출할 수 있습니다.
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 \
-exec tar zcvf DB-Backup-17082012.tgz {} \+
{} \+
위의 find 매개변수는 2가지 작업을 수행합니다. 는 호출될 때 이 위치에 있는 각 파일의 이름을 대체하며 {}
, 호출하기 전에 명령줄에서 가능한 한 많은 파일을 계속 추가하라는 지시를 받습니다. 명령줄에 추가할 파일이 100개 있으면 호출 100개가 절약됩니다.find
tar
\+
find
tar
tar
인용하다
답변3
현재 형식은 ls|grep "Aug 17"
아무것도 출력하지 않습니다. 대신 다음 형식을 사용하세요.
$ ls -ltr | grep 'Aug 17'
답변4
이 awk 라인 에 대해 $(ls -lrth|grep "Aug 17")
원하는 날짜를 추출할 수 있습니다.
$(ls -lrth|awk '/Aug/&&/17{print $0}')