Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果要附加到现有的.gz文件(如果存在),如何安全地进行gzip并删除该文件?_Bash_Shell_Find_Gzip_Xargs - Fatal编程技术网

Bash 如果要附加到现有的.gz文件(如果存在),如何安全地进行gzip并删除该文件?

Bash 如果要附加到现有的.gz文件(如果存在),如何安全地进行gzip并删除该文件?,bash,shell,find,gzip,xargs,Bash,Shell,Find,Gzip,Xargs,我的脚本当前如下所示: find Logs/ -type f -name \*.log -exec gzip -q -9 {} \; $ ./test-gzip-combine.sh ---- logs/a.log.gz compressed uncompressed ratio uncompressed_name 38 12 50.0% logs/a.log hello world --

我的脚本当前如下所示:

find Logs/ -type f -name \*.log -exec gzip -q -9 {} \;
$ ./test-gzip-combine.sh 
---- logs/a.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 38                  12  50.0% logs/a.log
hello
world
---- logs/b.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 31                   5 120.0% logs/b.log
miss
---- logs/c.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 32                   6 100.0% logs/c.log
think
现在,如果myLog.log.gz已经存在,则此操作将失败。相反,我想附加到myLog.log.gz。gzip手册页面说,您可以使用类似于
gzip-cmylog.log>>myLog.log.gz
的东西来实现这一点。但这不会在完成gzip时删除myLog.log


如何安全地gzip并删除该文件,必要时附加到现有的.gz?

首先,根据您想要执行的操作(例如,仅出于存档目的),仅对这两个文件进行tar或类似操作可能更合适。然而,以下是您解释的需求

我真的希望:)有一种更简洁的方法可以做到这一点,但缺少这种方法:

这里有一个小的测试脚本-将上面的脚本放在
gzip combine.sh
中,下面的脚本放在
test gzip combine.sh
中,并在某个临时文件夹中运行它(如您所见,它会删除该文件夹下的
logs
,因此不要在实际有日志的地方运行它:):

输出如下所示:

find Logs/ -type f -name \*.log -exec gzip -q -9 {} \;
$ ./test-gzip-combine.sh 
---- logs/a.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 38                  12  50.0% logs/a.log
hello
world
---- logs/b.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 31                   5 120.0% logs/b.log
miss
---- logs/c.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 32                   6 100.0% logs/c.log
think
因此,您可以看到它结合了
a.log
中的
world
a.log.gz
,这是上面
gzip logs/a.log
的结果,其中包含
hello

显然,由于许多原因(例如,如果磁盘空间不足、电量不足或日志都是1GB或诸如此类的情况),这并不是万无一失的,但对于大多数常规应用程序,它应该可以完成这项工作


希望这能有所帮助。

首先,根据您想做什么(例如,仅出于存档目的),只对这两个文件进行tar可能更合适。然而,以下是您解释的需求

我真的希望:)有一种更简洁的方法可以做到这一点,但缺少这种方法:

这里有一个小的测试脚本-将上面的脚本放在
gzip combine.sh
中,下面的脚本放在
test gzip combine.sh
中,并在某个临时文件夹中运行它(如您所见,它会删除该文件夹下的
logs
,因此不要在实际有日志的地方运行它:):

输出如下所示:

find Logs/ -type f -name \*.log -exec gzip -q -9 {} \;
$ ./test-gzip-combine.sh 
---- logs/a.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 38                  12  50.0% logs/a.log
hello
world
---- logs/b.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 31                   5 120.0% logs/b.log
miss
---- logs/c.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 32                   6 100.0% logs/c.log
think
因此,您可以看到它结合了
a.log
中的
world
a.log.gz
,这是上面
gzip logs/a.log
的结果,其中包含
hello

显然,由于许多原因(例如,如果磁盘空间不足、电量不足或日志都是1GB或诸如此类的情况),这并不是万无一失的,但对于大多数常规应用程序,它应该可以完成这项工作


希望这有帮助。

它不应该匹配,因为您在
*.log
-它不应该匹配
*.log.gz
。这需要
*.log*
。它不应该失败吗?如果我将myLog.log和myLog.log.gz都放在同一个目录中,它就会失败,因为gzip不想覆盖myLog.log.gzyes,但请注意手册页中的示例是
gzip-c file1>foo.gz;gzip-c file2>>foo.gz
。连接的文件名与gz文件不同。您所拥有的将弄乱现有的myLog.log.gz,或者至少会导致大量重复数据存储到.gz文件中,即
ver1log>>log.gz;ver2log>>log.gz ver3log>>log.gz
祝你好运。它不应该匹配,因为你在
*.log
上匹配-它不应该匹配
*.log.gz
。这需要
*.log*
。它不应该失败吗?如果我将myLog.log和myLog.log.gz都放在同一个目录中,它就会失败,因为gzip不想覆盖myLog.log.gzyes,但请注意手册页中的示例是
gzip-c file1>foo.gz;gzip-c file2>>foo.gz
。连接的文件名与gz文件不同。您所拥有的将弄乱现有的myLog.log.gz,或者至少会导致大量重复数据存储到.gz文件中,即
ver1log>>log.gz;ver2log>>log.gz ver3log>>log.gz
祝你好运。