원본 파일을 유지하도록 gzip에 어떻게 알릴 수 있습니까?

원본 파일을 유지하도록 gzip에 어떻게 알릴 수 있습니까?

gzip 명령줄 도구를 사용하여 텍스트 파일을 압축하고 싶습니다.유지하다원본 파일. 기본적으로 다음 명령이 실행됩니다.

gzip file.txt

결과적으로 파일이 수정되고 이름이 변경됩니다 file.txt.gz. 이 새 압축 파일을 다음 위치에 넣고 싶습니다.다음에 추가기존에 file.txt. 이제 이 작업을 수행하기 위해 다음 명령을 사용하고 있습니다.

gzip -c file.txt > file.txt.gz

작동하지만 왜 그렇게 일반적인 작업에 대한 더 쉬운 솔루션이 없는지 궁금합니다. 어쩌면 내가 이것을 할 수 있는 옵션을 놓쳤는가?

답변1

GNU gzip1.6 이상, FreeBSD 및 그 파생 제품 또는 최신 버전의 NetBSD에 대해서는 다음을 참조하세요.돈 크리스티의 답변.

모든 버전에서 다음과 같이 셸 리디렉션을 사용할 수 있습니다.

gzip < file.txt > file.txt.gz

인수가 제공되지 않으면 gzip표준 입력이 읽고 압축되며 압축된 버전이 표준 출력에 기록됩니다. 추가 보너스로, 쉘 리디렉션을 사용할 때 "--help"이름이 또는인 파일 에 대해 걱정할 필요가 없습니다 "-"(후자는 여전히 문제입니다 gzip -c --).

또 다른 이점 gzip -c file.txt > file.txt.gz은 열 수 없는 경우 빈 명령을 만들지 않고 (또는 기존 명령을 덮어쓰지 않고 ) file.txt명령이 실패하고 전혀 실행되지 않는다는 것입니다.file.txt.gzfile.txt.gzgzip

이에 비해 한 가지 중요한 차이점 gzip -kfile.txt메타데이터(소유권, 권한, 수정 시간, 압축되지 않은 파일 이름)를 file.txt.gz.

또한 이미 존재하는 경우 셸( 예: POSIX 셸) 에서 옵션을 설정 file.txt.gz하지 않는 한 자동으로 덮어씁니다 .noclobberset -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이것은 gzipNetBSD를 기반으로 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

관련 정보