2017-02-10 3 views
1

"logs"디렉토리 (Sandbox/tmp/logs)에서 모든 파일 (tar 사용)을 압축하는 스크립트를 만들고 싶습니다. 내가 잘못 가고 있는지 모르지만 모든 파일, 디렉토리 및 경로를 압축하고 있습니다. 나는 싫어. 난 그냥 "로그"디렉토리에있는 파일을 압축 싶어요. 어떤 도움을 주시면 감사하겠습니다.파일 만 압축

여기 내 코드입니다 :

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

for file in ${LOG_FILES}/* ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done 

답변

1

난 당신이 요구하는지에 완전히 명확하지 않다,하지만 난 문제는 당신이 타르 너무 많은 경로 정보를 제공하고 있다는 생각 . 다음과 같은 파일이 있다고 가정하자 :

/Sandbox/tmp/logs/foo 
/Sandbox/tmp/logs/bar 
/Sandbox/tmp/logs/baz 

당신은 기본적으로 다음 명령 실행이 무엇 : 모든 경로를 포함하는 방법

tar -cvzf "/Sandbox/tmp/logs/foo.tar.gz" "/Sandbox/tmp/logs/foo" 
tar -cvzf "/Sandbox/tmp/logs/bar.tar.gz" "/Sandbox/tmp/logs/bar" 
tar -cvzf "/Sandbox/tmp/logs/baz.tar.gz" "/Sandbox/tmp/logs/baz" 

참고; tar은 아카이브에 경로를 유지하려고 시도하므로 tarball을 추출 할 때 모든 것이 재구성됩니다 (예 : foo/bar.txtbaz.txt을 압축하려는 경우 bar.txtfoo 하위 디렉토리에 있음). 그와

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

cd "${LOG_FILES}" 

for file in * ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done 

다음과 같은 새로운 될 겁니다 :

이 주위에 얻을 수있는 가장 쉬운 방법은 트릭을 할해야 루프 외부 /Sandbox/tmp/logs에 ... 경로의 변경 디렉토리를 제거하는 것입니다 파일 : 그러나

/Sandbox/tmp/logs/foo.tar.gz 
/Sandbox/tmp/logs/bar.tar.gz 
/Sandbox/tmp/logs/baz.tar.gz 

, 당신은 스크립트에 문제가 나중에이 될 수있는, /Sandbox/tmp/logs 여전히 지금입니다. 이것은 당신이 서브 쉘 사용할 수 있습니다 해결하기 위해 : 이제

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

(cd "${LOG_FILES}"; 
for file in * ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done) 

을 말했다 모두, 당신은 정말 하나의 파일을 압축 타르를 사용할 필요가 없습니다. 대신 gzip을 직접 사용할 수 있습니다. 당신은 몇 바이트, 바로 옆에 입력 파일을 만드는 gzip 기본값을 절약 할 수 있습니다, 그래서 당신은 cd cruft에 제거 할 수 있습니다

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

for file in "${LOG_FILES}"/*; do 
    gzip -k "$file" 
done 

/Sandbox/tmp/logs/foo.gz 
/Sandbox/tmp/logs/bar.gz 
/Sandbox/tmp/logs/baz.gz 

그리고 gzip을 얻을 것입니다 어떤 여러 입력을 여러 출력으로 행복하게 압축 할 수 있으므로 한 줄 짜리만 있으면 그냥 갈 수 있습니다.

gzip -k "${LOG_FILES}"/* 

그리고 y GNU를 병렬로 설치하면 파일을 병렬로 압축 할 수 있습니다.

parallel gzip -k ::: /Sandbox/tmp/logs/*