ls 출력을 grepping하는 명령 대체로 인해 오류가 발생함

ls 출력을 grepping하는 명령 대체로 인해 오류가 발생함

명령 대체를 사용하여 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일에 마지막으로 수정된 파일만 찾고 최신 파일은 찾지 않습니다. -print0null 문자( )를 사용하여 출력 파일을 분할하고 각 파일을 가져온 다음 파일을 일괄 추가하는 호출을 작성하도록 find에 지시합니다 .\0xargs -0tar

이는 아마도 가장 성능이 낮은 방법일 것입니다.

노트: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개가 절약됩니다.findtar\+findtartar

인용하다

답변3

현재 형식은 ls|grep "Aug 17"아무것도 출력하지 않습니다. 대신 다음 형식을 사용하세요.

$ ls -ltr  | grep 'Aug 17'

답변4

이 awk 라인 에 대해 $(ls -lrth|grep "Aug 17")원하는 날짜를 추출할 수 있습니다.

$(ls -lrth|awk '/Aug/&&/17{print $0}')

관련 정보