나는 이것이 기본적인 질문이라는 것을 알고 있지만 도와주세요. 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
루프가 실행될 때마다 tar
put 명령이 실행됩니다.하나파일 대 파일 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.tar
8월에 호출되고 회전된 로그 파일 자체가 특정 날짜에 호출되는 경우 /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
.