仅压缩文件

时间:2017-02-10 20:42:44

标签: file compression

我想要一个脚本来压缩" 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

1 个答案:

答案 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.txtbaz.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}"/*