Как создать gzip файл без .gz расширения файла?

Установка пакета MySQL в Ubuntu создает a mysql пользователь и группа того же имени. Это - пользователь, под которым работает процесс демона MySQL, и много связанных с MySQL файлов принадлежат тому пользователю. При установке MySQL вручную Вы, возможно, должны создать пользователя сами.

chown mysql:mysql /data/tmp (выполняемый как корень), делает пользователя mysql и группа mysql пользователь владения и владение группой файла или каталога /data/tmp. Я не знаю, почему эти люди сделали это, необходимо будет спросить их.

14
21.03.2013, 20:39
6 ответов

Это НЕ работает:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

Это - состояние состязания:

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

Проблема состоит в том что > example.txt (или dd of=example.txt в этом отношении), уничтожает файл, прежде чем другой процесс будет иметь шанс считать его. Таким образом, нет никакого очевидного решения, которое является, почему необходимо придерживаться mv.

Существует много способов, которыми Вы могли обмануть. Можно открыть файл, затем удалить связь с ним - файл продолжит существовать, пока Вы не закроете его - и затем создаете новый файл с тем же именем и пишете gzipped данные в это. Однако я не знаю очевидный способ принудить удар для использования этого, и даже если бы я сделал, то мой ответ все еще был бы:

Даже не делайте этого.

Если gzip сбои по любой причине или любой проблеме происходит, как Вы исчерпывающий пространство, в то время как gzipping (потому что другие процессы пишут, или результат gzip, больше, чем вход - который происходит для случайных данных - и т.д.), Вы просто потеряли свой файл.Поздравляю!

Создайте отдельный файл и mv на успехе. Это является самым простым, легким понять, и самый надежный метод, который Вы будете когда-либо находить.

12
27.01.2020, 19:50
  • 1
    Как насчет того, чтобы добавить ради полноты: gzip example.txt && mv example.txt.gz example.txt –  depquid 21.03.2013, 21:07
  • 2
    Никакие depquid не читают OP - это неэлегантно. –  goldilocks 21.03.2013, 21:08
  • 3
    @goldilocks "Создает отдельный файл и mv на успехе". может быть сделан более изящным? Я просто пытался предположить что ответ frostschutz быть увеличенным с определенным примером. Если mv может использоваться более изящно, чем я думал, дайте пример. –  depquid 21.03.2013, 23:39
  • 4
    Ваше предложение является простым, изящным, очевидным подходом, но работает ли это, зависит от такого количества переменных, например, что Вы делаете, если уже существует example.txt.gz? Также без расширения для работы с уже необходимо предотвратить gzipping gzipped файлы так или иначе. Это - совершенно новая куча проблем, но это не было действительно частью вопроса. –  frostschutz 21.03.2013, 23:49

На самом деле это не то, что вам следует делать, главным образом потому, что при передаче этого файла другим системам или людям это может запутать их и не находит его как сжатый файл.

Если вы не хотите использовать какой-либо суффикс, то GNU вам не подходит, поскольку gzip -S "" вернет gzip: недопустимый суффикс '' .

Однако вы всегда можете отправить что-то вроде gzip -S "" (пробел), и это будет выглядеть так:

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

После этого, если вы захотите распаковать его, у вас будет сделать что-то вроде gunzip -c testfile \ (без указания суффикса) или даже с флагом -f .

Я искренне думаю, что добавление команды mv с && не доставит особых хлопот вашему коду. В любом случае, как сказал @frostschutz, это не очень хорошая идея.

0
27.01.2020, 19:50

Для этого можно попробовать s3_website.

Мне не нравится, что он написан и на скале, и на рубине, и что ему нужен JVM. Также мне не нравится предположение, которое он делает (особенно тот факт, что он удаляет лишние файлы из ведра), но он должен работать, если вы не против.

Я планирую написать такой инструмент самостоятельно, у которого нет этих ограничений, оставайтесь с нами.

1
27.01.2020, 19:50

У меня была такая же проблема в рамках развертывания ИЦ в AWS S3.

Это то, что я сделал для рекурсивного gzipping каталога (на месте) без суффикса .gz:

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

Кажется достаточно чистым для меня. Но да, похоже, что вам нужен mv где-то там.

Если вы используете grunt, вы можете посмотреть на grunt-contrib-compress. Некоторые из инструментов grunt, специально предназначенные для установки в S3, будут работать и с gzip.

10
27.01.2020, 19:50

Для каталогов разрешение r означает, что можно получить список записей каталога (т.е. имена файлов и подкаталогов, которые он содержит). x означает, что доступ к файлам или подкаталогам возможен по имени. wx означает, что можно добавлять или удалять записи каталога по имени (т.е. добавлять или удалять файлы и подкаталоги). ( w без x не позволяет ничего.)

Поэтому каталог с -wx означает, что можно сделать все, кроме списка записей каталога. (Конечно, доступ к отдельным файлам и подкаталогам по-прежнему регулируется их собственными битами разрешения. Однако для удаления файла не требуется никаких разрешений, только разрешение на запись в каталог.)

-121--74957-

Хорошо, я в конце концов нашел его. Он называется debug.exception-trace .

sysctl -w debug.exception-trace = 0 или echo 0 >/proc/sys/debug/exception-trace отключит его.

# dmesg -c
# dmesg
# echo 'main;' | gcc -xc - && ./a.out
<stdin>:1:1: warning: data definition has no type or storage class
Segmentation fault
# dmesg
[  539.421736] a.out[1875]: segfault at 600874 ip 0000000000600874 sp 00007ffed85e7018 error 15 in a.out[600000+1000]
# sysctl debug.exception-trace
debug.exception-trace = 1 
# ./a.out 
Segmentation fault
# dmesg
[  539.421736] a.out[1875]: segfault at 600874 ip 0000000000600874 sp 00007ffed85e7018 error 15 in a.out[600000+1000]
[  584.492171] a.out[1878]: segfault at 600874 ip 0000000000600874 sp 00007ffc6b0d2358 error 15 in a.out[600000+1000]
# sysctl -w debug.exception-trace=0
debug.exception-trace = 0 
# ./a.out 
Segmentation fault
# dmesg
[  539.421736] a.out[1875]: segfault at 600874 ip 0000000000600874 sp 00007ffed85e7018 error 15 in a.out[600000+1000]
[  584.492171] a.out[1878]: segfault at 600874 ip 0000000000600874 sp 00007ffc6b0d2358 error 15 in a.out[600000+1000]

Последнее сегфо не зарегистрировано в журнале.

-121--98859-

-S Расширение Вы хотите

gzip -S "`_date +%Y_%M' dog.txt 

приведет к тому, dog.txt_2015_11

when вы распакуете его, вы должны указать расширение.

gzip -d _2015_11 dog.txt_2015_11

В unix используйте команду file, чтобы определить тип файла, расширения которого вводят в заблуждение или часто отсутствуют.

2
27.01.2020, 19:50

Я не думаю, что создание gzip-файла без расширения является правильным решением.

IMHo вы должны настроить свой веб-сервер на чтение .gz файла. Возможно, у вас уже есть такое правило:

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

Вам просто нужно добавить правило, переписывающее запрашиваемое имя файла, чтобы добавить ".gz" (на самом деле, вы должны проверить, что файл существует, так же как вы должны проверить, что клиент указал gzip в заголовке Accept-Encoding)

1
27.01.2020, 19:50

Теги

Похожие вопросы