我想有一个脚本,将压缩所有的文件(使用tar)在“日志”目录(Sandbox/tmp/logs)。不知道哪里出错了,但它正在压缩所有的文件、目录和路径。我可不想这样。我只想压缩"log“目录中的文件。任何帮助都将不胜感激。
下面是我的代码:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
for file in ${LOG_FILES}/* ; do
tar -cvzf "${file}.tar.gz" "$file"
done发布于 2017-02-11 10:44:55
我不完全清楚您在问什么,但我认为您的问题是您向tar提供了太多的路径信息。假设您有以下文件:
/Sandbox/tmp/logs/foo
/Sandbox/tmp/logs/bar
/Sandbox/tmp/logs/baz您所拥有的基本上将运行以下命令:
tar -cvzf "/Sandbox/tmp/logs/foo.tar.gz" "/Sandbox/tmp/logs/foo"
tar -cvzf "/Sandbox/tmp/logs/bar.tar.gz" "/Sandbox/tmp/logs/bar"
tar -cvzf "/Sandbox/tmp/logs/baz.tar.gz" "/Sandbox/tmp/logs/baz"注意所有路径是如何包含的;tar试图维护归档中的路径,以便在解压tarball时,所有内容都会按原样重新构建(例如,如果您想压缩foo/bar.txt和baz.txt,那么当您解压它们时,您可能希望bar.txt位于foo子目录中)。
解决这个问题最简单的方法就是去掉路径…在循环外将目录更改为/Sandbox/tmp/logs应该可以做到这一点:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
cd "${LOG_FILES}"
for file in * ; do
tar -cvzf "${file}.tar.gz" "$file"
done这样,您将得到以下新文件:
/Sandbox/tmp/logs/foo.tar.gz
/Sandbox/tmp/logs/bar.tar.gz
/Sandbox/tmp/logs/baz.tar.gz但是,您现在仍然在/Sandbox/tmp/logs中,这可能会在稍后的脚本中出现问题。为了解决这个问题,你可以使用子subshell:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
(cd "${LOG_FILES}";
for file in * ; do
tar -cvzf "${file}.tar.gz" "$file"
done)现在,您真的不需要使用tar来压缩单个文件。相反,您可以直接使用gzip;您将节省几个字节,并且gzip默认在输入旁边创建一个文件,这样您就可以摆脱cd的繁琐:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
for file in "${LOG_FILES}"/*; do
gzip -k "$file"
done这将会产生
/Sandbox/tmp/logs/foo.gz
/Sandbox/tmp/logs/bar.gz
/Sandbox/tmp/logs/baz.gz而且gzip会很乐意地将多个输入压缩成多个输出,所以如果你想要一行代码,你可以使用
gzip -k "${LOG_FILES}"/*而且,如果您安装了GNU parallel,则可以使用以下命令并行压缩文件
parallel gzip -k ::: /Sandbox/tmp/logs/*https://stackoverflow.com/questions/42168346
复制相似问题