Chciałbym skompresować plik tekstowy za pomocą narzędzia wiersza polecenia gzip, zachowując oryginalny plik. Domyślnie uruchamiane jest następujące polecenie
gzip file.txt
powoduje modyfikację tego pliku i zmianę jego nazwy file.txt.gz
. zamiast tego zachowania chciałbym mieć ten nowy skompresowany plik oprócz istniejącego file.txt
. Na razie używam do tego następującego polecenia
gzip -c file.txt > file.txt.gz
Działa, ale zastanawiam się, dlaczego nie ma łatwiejszego rozwiązania tak powszechnego zadania? Może przegapiłem opcję zrobienia tego?
command-line
files
gzip
Manuel Selva
źródło
źródło
Odpowiedzi:
W przypadku GNU
gzip
1.6 lub nowszego, FreeBSD i pochodnych lub najnowszych wersji NetBSD, patrz odpowiedź don_cristi .W każdej wersji możesz używać przekierowań powłoki jak w:
Gdy nie podano żadnego argumentu,
gzip
odczytuje standardowe wejście, kompresuje je i zapisuje skompresowaną wersję na standardowe wyjście. Jako bonus, gdy korzystasz z przekierowań powłoki, nie musisz się martwić o wywołane pliki"--help"
lub"-"
(ten drugi problem nadal jest problememgzip -c --
).Kolejną zaletą
gzip -c file > file.gz
jest to, że jeślifile
nie można otworzyć, polecenie zakończy się niepowodzeniem bez utworzenia pustegofile.gz
(lub zastąpienia istniejącegofile.gz
) i bez uruchamianiagzip
.Istotna różnica w porównaniu z
gzip -k
tym, że nie będzie próby skopiowaniafile
metadanych (własność, uprawnienia, czas modyfikacji, nazwa nieskompresowanego pliku) dofile.gz
.Również jeśli
file.gz
już istniał, po cichu zastąpi go, chyba że włączysz tęnoclobber
opcję w swojej powłoce (set -o noclobber
na przykład w powłokach POSIX).źródło
-c
.-k
opcja Nie można go znaleźć na stronach podręcznika man, np. Ta wersja tutaj linux.die.net/man/1/gzip . Wygląda na to, że gzip domyślnie kopiuje metadane pliku.Zauważ, że niedawno wydany (czerwiec 2013) „akceptuje opcję --keep (-k), dla zachowania spójności z narzędziami takimi jak xz, lzip i bzip2. Dzięki tej opcji gzip nie usuwa już nazwanych plików wejściowych podczas kompresji lub dekompresji” .
gzip-1.6
Fragment strony man:
Od tego momentu
1.6
możesz użyć-k
lub--keep
zachować oryginalny plik:(zwróć uwagę, że nie działa, jeśli
$file
jest-
(cogzip
interpretuje jako oznaczające standardowe wejście zamiast rzeczywistego wywołanego pliku-
), w takim przypadku musisz go zmienić na./-
)Ta opcja została po
gzip
raz pierwszy wprowadzona w implementacji FreeBSD (w FreeBSD 7.0 w 2007 r.) W celu zachowania spójności zbzip2
. Którygzip
opiera się na przepisanie GNUgzip
przez NetBSD.-k
Opcja w końcu się go z powrotem do NetBSD w 2010 roku .źródło
Z dokumentacji wynika, że nie ma opcji utworzenia kopii pliku.
Możesz zdefiniować funkcję powłoki
i wtedy
źródło
-
, musisz nazwać go jakogzipkeep ./-
.