我想要一个脚本来压缩" logs"中的所有文件(使用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
答案 0 :(得分:1)
我并不完全清楚你在问什么,但我认为你的问题是你为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
,当您提取它们时,您可能需要{ {1}}位于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
,可能在您的脚本中出现问题。要解决这个问题,您可以使用子shell:
/Sandbox/tmp/logs
现在,所有这一切,你真的不需要使用 tar 来压缩单个文件。相反,您可以直接使用#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
(cd "${LOG_FILES}";
for file in * ; do
tar -cvzf "${file}.tar.gz" "$file"
done)
;您将保存几个字节,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
而且,如果您安装了GNU并行程序,则可以使用类似
的内容并行压缩文件gzip -k "${LOG_FILES}"/*