/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.txt
및 baz.txt
을 압축하려는 경우 bar.txt
이 foo
하위 디렉토리에 있음). 그와
#!/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/*