我想创建一个保留原始文件名的压缩文件。例如,将“ example.txt”压缩为gzip文件应输出名为“ example.txt”而不是“ example.txt.gz”的压缩文件。是否可以用一个命令优雅地执行此操作(而不执行后续命令mv
)?
我想创建一个保留原始文件名的压缩文件。例如,将“ example.txt”压缩为gzip文件应输出名为“ example.txt”而不是“ example.txt.gz”的压缩文件。是否可以用一个命令优雅地执行此操作(而不执行后续命令mv
)?
Answers:
这不起作用:
# 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
。
您可以通过多种方式作弊。您可以打开文件,然后取消链接-该文件将一直存在,直到您将其关闭-然后创建一个具有相同名称的新文件,并将压缩后的数据写入该文件。但是我不知道强迫bash使用它的明显方法,即使我这样做,我的答案仍然是:
甚至都不做。
如果gzip
由于任何原因失败或发生任何问题(例如gzip压缩时空间不足)(因为正在写入其他进程,或者gzip的结果大于输入的值(对于随机数据等),则只是丢失了文件) 。恭喜你!
创建一个单独的文件并mv
成功。这是您将找到的最简单,易于理解和最可靠的方法。
gzip example.txt && mv example.txt.gz example.txt
mv
成功创建一个单独的文件。” 可以变得更优雅?我只是想提出一个具体的例子来扩大弗罗斯特斯的答案。如果mv
可以比我想象的更优雅地使用,请举一个例子。
您可以尝试使用s3_website。
我不喜欢它同时使用scala和ruby编写并且需要JVM的事实。我也不喜欢它的假设(特别是它从存储桶中删除多余文件的事实),但是如果您满意的话,它应该可以工作。
我打算自己编写一个没有这些限制的工具,请继续关注。
这实际上并不是您应该执行的操作,主要是因为将文件传输到其他系统或人员时,可能最终会使他们感到困惑,并且找不到作为压缩文件的文件。
如果您不想使用任何后缀,那么GNU对您不利,因为gzip -S ""
会返回gzip: invalid suffix ''
。
但是,您始终可以发送类似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所说,这样做不是一个好主意。