자동화 작업이 끝나면 일부 로그 파일을 패키징하여 분석해야 할 경우를 대비해 어딘가에 저장하고 싶습니다. 로그 파일은 호스트의 여러 다른 위치에 있으며 그 중 일부는 매우 클 수 있습니다.
다음 파일이 존재하고 그 파일을 모두 원한다고 가정합니다.
/app/app_stderr.log
/app/app_stdout.log
/var/log/service/service.log
/var/lib/service/service_backend.log
/var/log/messages.log
하지만 tar 파일에는 어떤 경로도 원하지 않습니다. 다음 5개 파일만 필요합니다.
app_stderr.log
app_stdout.log
service.log
service_backend.log
messages.log
나는 또한 gzip으로 압축된 tar 아카이브를 원합니다. 이상적으로는 가능한 가장 효율적인 방법으로 이 작업을 수행하고 싶습니다. 즉, gzip 압축 전에 로그 파일을 복사하거나 압축되지 않은 tar 파일을 임시로 저장할 필요가 없습니다.
유사한 질문에 대한 해결책으로 -C
일반적으로 제공되는 옵션은 나에게 적합하지 않습니다.많은 종류의경로 이름을 제거하는 동안 파일 시스템의 다른 부분에 있는 디렉터리.
방금 실행하면 :
tar -czf /drop/run_logs.tar.gz /app/app_*.log /var/log/service/*.log /var/lib/service/*.log /var/log/messages.log
그런 다음 경로가 포함된 tar 파일을 가져옵니다.
스트리핑 경로를 완료할 수 있나요?
답변1
tar --transform
옵션을 사용하면 tar 파일을 쓰기 전에 파일 이름을 수정할 수 있습니다. 이 옵션은 sed
tar 파일에 쓰기 전에 표현식을 통해 파일 이름을 실행합니다. 바라보다여기자세한 내용을 확인하세요.
이것은 간단한 예입니다.
먼저 몇 개의 파일을 생성하고 tar 파일에 추가합니다.
$ mkdir test-tar
$ cd test-tar
$ mkdir -p alpha/beta/gamma
$ touch alpha/one.log
$ touch alpha/beta/two.log
$ touch alpha/beta/gamma/three.log
tar
전체 상대 경로로 tar 파일을 재생하려면 표준을 사용하십시오 .
$ tar cf test.tar alpha/*.log alpha/beta/*.log alpha/beta/gamma/*.log
$ tar tf test.tar
alpha/one.log
alpha/beta/two.log
alpha/beta/gamma/three.log
이제 명령을 다시 실행하되 이 --transform
옵션을 사용하십시오. 이 예에서는 sed 표현식을 사용하여 s#.*/##
파일 이름에서 가장 오른쪽 문자까지 모든 선행 문자를 제거합니다 /
.
$ tar cf test-transform.tar alpha/*.log alpha/beta/*.log alpha/beta/gamma/*.log --transform='s#.*/##'
이제 tar 파일에 기록된 내용을 확인하세요.
$ tar tf test-transform.tar
one.log
two.log
three.log
부팅 경로가 없습니다.