for 루프의 tar 명령

for 루프의 tar 명령

나는 이것이 기본적인 질문이라는 것을 알고 있지만 도와주세요. tar다음 명령을 사용하여 서버 로그 파일을 압축하고 보관합니다 .

for i in server.log.2016-07-05 server.log.2016-07-06 ; do tar -zcvf  server2.tar.gz $i; done

위 루프의 출력은 다음과 같습니다.

server.log.2016-07-05
server.log.2016-07-06

그러나 tar -tvf server2.tar.gz 얻은 출력을 사용하여 파일을 나열할 때,

rw-r--r-- root/root 663643914 2016-07-06 23:59 server.log.2016-07-06

즉, 두 개의 파일을 아카이브했지만 하나의 파일만 표시됩니다. 이는 아카이브에 이 두 파일이 포함되어 있지 않으며 아카이브에 모든 파일이 포함되어야 함을 의미합니다. 이 문제를 해결하는 데 도움을 주세요.

방금 이 두 파일을 테스트했는데 내 폴더에 여러 파일이 있습니다. 예상한 출력을 얻지 못했기 때문에 폴더의 모든 파일을 진행하지 않았습니다. 내가 사용하고 싶은 정확한 루프는

Previousmonth=$(date "+%b" --date '1 month ago')

for i in $(ls -l | awk '/'$Previousmonth'/ && /server.log./ {print $NF}');do;tar -zcvf server2.tar.gz $i;done

답변1

루프가 실행될 때마다 tarput 명령이 실행됩니다.하나파일 대 파일 server2.tar.gz. 파일은 결국 하나의 파일이 됩니다.

tar 옵션을 사용하여 파일을 첨부합니다.

tar --append -zcvf server2.tar.gz "$i"

아니면 그냥 파일 목록을 tar에 입력하세요(이 명령을 사용하지 마세요):

tar -zcvf server2.tar.gz  $(ls -l|awk '/'$Previousmonth'/&&/server.log./{print $NF}')

그러나 이 명령줄에는 몇 가지 문제가 있습니다.

  • 구문 분석 ls출력(오류).
  • 따옴표 없이 사용하세요 $Previousmonth(오류).
  • 공백이 포함될 수 있는 파일 목록을 작성하십시오(신뢰할 수 없음).

대신 다음 명령(한 쌍)을 사용하십시오.

month=$(date "+%Y-%m-" --date '1 month ago')
find ./ -name "server.log.${month}*" -exec tar -zcvf server2.tar.gz '{}' \+

답변2

원래 질문에 답하다

해결책은 루프를 사용하지 않는 것입니다 for. 매번 파일을 덮어씁니다. 대신 다음을 사용하세요.

tar -zcvf server2.tgz server.log.2016-07-05 server.log.2016-07-06

그러면 동일한 아카이브에 명령줄에 나열된 파일 수가 추가됩니다.

수정된 질문에 답하세요

7월의 모든 파일을 압축하려면:

tar -zcvf server2.tgz server.log.2016-07-*

또는 파일 형식에 관계없이 이전 달의 모든 파일을 압축하려면 다음을 수행하세요.

tar -zcvf server2.tgz server.log.$(date "+%Y-%m" --date '1 month ago')-*

답변3

@John1024 이미 주셨네요좋은 대답, 하지만 뭔가 추가해야겠다고 생각했습니다.

어떤 경우에는 다음을 원할 수도 있습니다.tar기존 아카이브 에 파일 추가. 예를 들어, 월별 로그 파일 아카이브가 있고 매일 밤 자정에 로그 파일 순환이 발생한 후 해당 아카이브에 일별 로그 파일을 추가하려고 합니다.

아카이브가 /data/logs/logfiles-2016-08.tar8월에 호출되고 회전된 로그 파일 자체가 특정 날짜에 호출되는 경우 /var/log/servicename-2016-08-06.log( 다양한 값에 대해 servicename) 오전 3시에 다음 작업을 수행하는 크론 작업에 의해 호출되는 작은 스크립트가 있을 수 있습니다.

#!/bin/sh

yyyymm="$( date --date="1 day ago" +"%Y-%m" )"
yyyymmdd="$( date --date="1 day ago" +"%Y-%m-%d" )"

for logfile in /var/log/*-$yyyymmdd.log; do
  tar -r -C /var/log -f "/data/logs/logfiles-$yyyymm.tar" "${logfile##*/}" &&
  rm "${logfile##*/}"
done

-r플래그는 tar항목이 아카이브에 추가되도록 지시합니다. 이 -C플래그는 로그 파일에 액세스하기 전에 디렉토리 변경을 나타내는 데 사용됩니다 tar. /var/log-f플래그는 아카이브의 위치를 ​​지정합니다. ${logfile##*/}로그 파일의 기본 이름(경로가 없는 파일 이름)으로 확장 됩니다 ( 로 대체 가능 $(basename "$logfile")).

매월 초에 다음 명령을 사용하여 이전 달의 로그 파일 아카이브를 압축할 수 있습니다.

#!/bin/sh

yyyymm="$( date --date="1 month ago" +"%Y-%m" )"

gzip --best "/data/logs/logfiles-$yyyymm.tar"

직접하는 것보다 조금 더 번거롭습니다

cd /var/log &&
tar -c -z -f /data/logs/logfiles-2016-08.tar.gz *-2016-08-??.log &&
rm *-2016-08-??.log

한 달에 한 번이지만 그렇게 해야 할 이유가 있을 수 있습니다.

tar -r참고: 다음을 사용하여 아카이브에 파일을 추가할 수 있습니다.압축 파일일 수 없습니다.당시(GNU는 tar아마도 이것을 지원했을 것입니다). 아카이브가 존재하지 않으면 생성됩니다. 또한 위의 예에는 GNU 가 필요하다는 점에 유의하세요 date.

관련 정보