Chciałbym utworzyć plik spakowany gzip, który zachowuje oryginalną nazwę pliku. Na przykład gzipping „example.txt” powinien wypisać plik gzipowany o nazwie „example.txt” zamiast „example.txt.gz”. Czy można to zrobić elegancko za pomocą jednego polecenia (nie wykonując kolejnego mv
)?
14
Odpowiedzi:
To nie działa:
To jest warunek wyścigu:
Problem polega na tym, że
> example.txt
(lubdd of=example.txt
w tym przypadku) zabija plik, zanim inny proces będzie miał szansę go odczytać. Więc nie ma oczywistego rozwiązania, dlatego powinieneś się trzymaćmv
.Istnieje wiele sposobów oszukiwania. Możesz otworzyć plik, a następnie odłączyć go - plik będzie istniał do momentu jego zamknięcia - a następnie utwórz nowy plik o tej samej nazwie i zapisz do niego skompresowane dane. Jednak nie znam oczywistego sposobu na zmuszenie basha do użycia tego, a nawet gdybym to zrobił, moja odpowiedź byłaby nadal:
Nawet tego nie rób.
Jeśli
gzip
z jakiegoś powodu zawiedzie lub wystąpi jakiś problem, na przykład gdy zabraknie Ci miejsca podczas gzipowania (ponieważ inne procesy zapisują lub wynik gzip jest większy niż dane wejściowe - co dzieje się w przypadku losowych danych - itp.), Właśnie straciłeś plik . Gratulacje!Utwórz osobny plik i
mv
na sukces. To najprostsza, łatwa do zrozumienia i najbardziej niezawodna metoda, jaką kiedykolwiek znajdziesz.źródło
gzip example.txt && mv example.txt.gz example.txt
mv
na sukces”. może być bardziej elegancki? Chciałem tylko zaproponować, aby odpowiedź frostschutza została wzbogacona o konkretny przykład. Jeślimv
można go używać bardziej elegancko, niż myślałem, proszę podać przykład.Miałem ten sam problem w ramach wdrożenia CI w AWS S3.
Oto co zrobiłem dla rekursywnego gzipowania katalogu (na miejscu) bez
.gz
przyrostka:Wydaje mi się wystarczająco czysty. Ale tak, wygląda na to, że potrzebujesz
mv
gdzieś tam.Jeśli używasz,
grunt
możesz na to spojrzećgrunt-contrib-compress
. Niektóre zgrunt
narzędzi specjalnie do wdrażania na S3 obsłużą również gzip.źródło
find . -type ...
niefind.
dodać przestrzeń proszę :)-S
rozszerzenie, które chceszspowoduje dog.txt_2015_11
po rozpakowaniu musisz podać rozszerzenie.
W Uniksie użyj polecenia file, aby określić, jaki typ pliku posiadasz, rozszerzenia wprowadzają w błąd lub często ich brakuje.
źródło
Nie sądzę, aby tworzenie pliku gzip bez rozszerzenia było naprawdę właściwe.
IMHo, powinieneś skonfigurować swój serwer WWW do odczytu pliku .gz. Prawdopodobnie masz już taką zasadę:
Wystarczy dodać regułę przepisującą żądaną nazwę pliku, aby dodać „.gz” (tak naprawdę powinieneś sprawdzić, czy plik istnieje, tak samo jak powinieneś sprawdzić, czy klient umieścił gzip w nagłówku Accept-Encoding)
źródło
Możesz spróbować s3_website do tego.
Nie podoba mi się fakt, że jest napisany zarówno w języku scala, jak i rubinowym i że potrzebuje JVM. Nie podoba mi się też to założenie (szczególnie fakt, że usuwa dodatkowe pliki z wiadra), ale powinno działać, jeśli nie masz nic przeciwko.
Planuję napisać takie narzędzie, które nie ma tych ograniczeń, bądźcie czujni.
źródło
To nie jest tak naprawdę powinieneś robić, głównie dlatego, że podczas przesyłania tego pliku do innych systemów lub osób może to być dla nich mylące i nie znaleźć go jako skompresowanego pliku.
Jeśli nie chcesz używać żadnego sufiksu, GNU nie jest dla ciebie dobre, tak jak
gzip -S ""
zwróciłoby agzip: invalid suffix ''
.Zawsze możesz jednak wysłać coś w rodzaju
gzip -S " "
(spacja), a zostanie to pokazane w następujący sposób:Następnie, jeśli chcesz go zdekompresować, będziesz musiał zrobić coś takiego
gunzip -c testfile\
(bez określania sufiksu), a nawet z-f
flagą.Szczerze myślę, że dodanie
mv
polecenia z&&
nie spowodowałoby tak dużego problemu w twoim kodzie. W każdym razie, jak powiedział @frostschutz, zrobienie tego nie jest dobrym pomysłem.źródło