gzip 명령줄 도구를 사용하여 텍스트 파일을 압축하고 싶습니다.유지하다원본 파일. 기본적으로 다음 명령이 실행됩니다.
gzip file.txt
결과적으로 파일이 수정되고 이름이 변경됩니다 file.txt.gz
. 이 새 압축 파일을 다음 위치에 넣고 싶습니다.다음에 추가기존에 file.txt
. 이제 이 작업을 수행하기 위해 다음 명령을 사용하고 있습니다.
gzip -c file.txt > file.txt.gz
작동하지만 왜 그렇게 일반적인 작업에 대한 더 쉬운 솔루션이 없는지 궁금합니다. 어쩌면 내가 이것을 할 수 있는 옵션을 놓쳤는가?
답변1
GNU gzip
1.6 이상, FreeBSD 및 그 파생 제품 또는 최신 버전의 NetBSD에 대해서는 다음을 참조하세요.돈 크리스티의 답변.
모든 버전에서 다음과 같이 셸 리디렉션을 사용할 수 있습니다.
gzip < file.txt > file.txt.gz
인수가 제공되지 않으면 gzip
표준 입력이 읽고 압축되며 압축된 버전이 표준 출력에 기록됩니다. 추가 보너스로, 쉘 리디렉션을 사용할 때 "--help"
이름이 또는인 파일 에 대해 걱정할 필요가 없습니다 "-"
(후자는 여전히 문제입니다 gzip -c --
).
또 다른 이점 gzip -c file.txt > file.txt.gz
은 열 수 없는 경우 빈 명령을 만들지 않고 (또는 기존 명령을 덮어쓰지 않고 ) file.txt
명령이 실패하고 전혀 실행되지 않는다는 것입니다.file.txt.gz
file.txt.gz
gzip
이에 비해 한 가지 중요한 차이점 gzip -k
은 file.txt
메타데이터(소유권, 권한, 수정 시간, 압축되지 않은 파일 이름)를 file.txt.gz
.
또한 이미 존재하는 경우 셸( 예: POSIX 셸) 에서 옵션을 설정 file.txt.gz
하지 않는 한 자동으로 덮어씁니다 .noclobber
set -o noclobber
답변2
가장 최근(2013년 6월)gzip-1.6
"xz, lzip 및 bzip2와 같은 도구와의 일관성을 위해 --keep(-k) 옵션을 허용합니다. 이 옵션을 사용하면 gzip은 압축 또는 압축 풀기 시 더 이상 지정된 입력 파일을 삭제하지 않습니다.".
매뉴얼 페이지에서 발췌:
-k --keep Keep (don't delete) input files during compression or decompression.
따라서 처음부터 원본 파일을 사용 하거나 유지할 1.6
수 있습니다 .-k
--keep
gzip -k -- "$file"
$file
-
(( gzip
의미로 해석되는 경우에는 작동하지 않습니다 .)표준 입력) 라는 실제 파일 대신 ) -
로 변경해야 합니다 ../-
그 옵션은FreeBSD 구현에 처음 도입됨gzip
(2007년 FreeBSD 7.0에서) bzip2
이것은 gzip
NetBSD를 기반으로 GNU를 재작성한 것입니다 gzip
. 이것-k
이 옵션은 결국 2010년에 NetBSD로 반환되었습니다..
답변3
문서에 따르면 파일 복사본을 만드는 옵션이 없는 것 같습니다.
쉘 함수를 정의할 수 있습니다.
gzipkeep() {
if [ -f "$1" ] ; then
gzip -c -- "$1" > "$1.gz"
fi
}
그런 다음
gzipkeep file.txt
답변4
@Matteo의 답변을 바탕으로 gzipkeep
해당 플래그가 없는 시스템에서 여러 파일을 한 번에 처리하는 gzip의 기능을 유지하면서 코드를 for 루프로 묶어 와일드카드를 처리 할 수 있습니다 -k
(그렇지 않으면 for 의 큰 이점임 -k
). 또한 시도된 각 파일의 상태를 볼 수 있도록 장황하게 만들었습니다.
gzipkeep() {
for file in "$@"; do
if [ -f "$file" ] ; then
gzip -cv9 -- "$file" > "$file.gz"
fi
done
}
그런 다음 와일드카드를 사용하여 실행합니다. 예를 들어:
gzipkeep images/*.svg