Я хотел бы создать сжатый файл, который сохраняет оригинальное имя файла. Например, при распаковке «example.txt» должен быть распакован файл с именем «example.txt», а не «example.txt.gz». Можно ли сделать это элегантно с помощью одной команды (без последующей mv
)?
14
Ответы:
Это не работает:
Это условие гонки:
Проблема в том, что
> example.txt
(илиdd of=example.txt
в этом отношении) убивает файл, прежде чем другой процесс сможет его прочитать. Так что нет очевидного решения, поэтому вы должны придерживатьсяmv
.Есть несколько способов обмануть. Вы можете открыть файл, затем отсоединить его - файл будет существовать до тех пор, пока вы его не закроете, - а затем создать новый файл с тем же именем и записать в него сжатые данные. Однако я не знаю очевидного способа заставить bash использовать это, и даже если бы я знал, мой ответ все равно будет:
Даже не делай этого.
Если
gzip
по какой-либо причине происходит сбой или возникает какая-либо проблема, например, когда у вас не хватает места во время gzipping (потому что другие процессы пишут, или результат gzip больше, чем ввод - что происходит для случайных данных - и т. Д.), Вы просто потеряли свой файл , Поздравляем!Создайте отдельный файл и
mv
в случае успеха. Это самый простой, легкий для понимания и самый надежный метод, который вы когда-либо найдете.источник
gzip example.txt && mv example.txt.gz example.txt
mv
в случае успеха." можно сделать более элегантным? Я просто пытался предложить, чтобы ответ Фростшуца был дополнен конкретным примером. Еслиmv
можно использовать более элегантно, чем я думал, приведите пример.У меня была такая же проблема, как часть развертывания CI на AWS S3.
Это то, что я сделал для рекурсивного сжатия каталога (на месте) без
.gz
суффикса:Кажется достаточно чистым для меня. Но да, похоже, тебе нужно
mv
где-то там.Если вы используете,
grunt
вы можете посмотретьgrunt-contrib-compress
. Некоторыеgrunt
инструменты, специально предназначенные для развертывания на S3, также будут работать с gzip.источник
find . -type ...
неfind.
добавлять пространство , пожалуйста :)-S
расширение, которое вы хотитеприведет к dog.txt_2015_11
когда вы распаковываете его, вы должны указать расширение.
В Unix используйте команду file, чтобы определить, какой тип файла у вас, расширения вводят в заблуждение или часто отсутствуют.
источник
Я не думаю, что создание gzip-файла без расширения - действительно правильная вещь.
IMHo вы должны настроить свой веб-сервер для чтения файла .gz. У вас, вероятно, уже есть такое правило:
Вам просто нужно добавить правило, переписывающее запрашиваемое имя файла, чтобы добавить «.gz» (на самом деле, вы должны убедиться, что файл существует, точно так же, как вы должны убедиться, что клиент перечислил gzip в заголовке Accept-Encoding)
источник
Вы можете попробовать s3_website для этого.
Мне не нравится тот факт, что он написан на scala и ruby, и что ему нужна JVM. Также мне не нравится предположение, которое он делает (особенно тот факт, что он удаляет дополнительные файлы из корзины), но оно должно работать, если вы хорошо с этим.
Я планирую написать такой инструмент самостоятельно, который не имеет этих ограничений, следите за обновлениями.
источник
Это на самом деле не то, что вам следует делать, в основном потому, что при передаче этого файла другим системам или людям он может запутаться и не найти его в виде сжатого файла.
Если вы не хотите использовать какой-либо суффикс, тогда GNU не подходит для вас, так как
gzip -S ""
возвращает agzip: invalid suffix ''
.Тем не менее, вы всегда можете отправить что-то вроде
gzip -S " "
(пробел), и это будет показано так:Впоследствии, если вы хотите распаковать его, вам нужно будет сделать что-то вроде
gunzip -c testfile\
(без указания суффикса) или даже с-f
флагом.Я искренне думаю, что добавление
mv
команды с помощью&&
не будет так хлопотно для вашего кода. В любом случае, как сказал @frostschutz, это не очень хорошая идея.источник