我想要一个脚本来压缩“logs”目录(Sandbox/tmp/logs)中的所有文件(使用tar)。不知道我哪里错了,但它正在压缩所有的文件,目录和路径。我不想要的。我只想压缩“日志”目录中的文件。任何帮助将不胜感激。仅压缩文件
这里是我的代码:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
for file in ${LOG_FILES}/* ; do
tar -cvzf "${file}.tar.gz" "$file"
done
我想要一个脚本来压缩“logs”目录(Sandbox/tmp/logs)中的所有文件(使用tar)。不知道我哪里错了,但它正在压缩所有的文件,目录和路径。我不想要的。我只想压缩“日志”目录中的文件。任何帮助将不胜感激。仅压缩文件
这里是我的代码:
#!/bin/bash
LOG_FILES="/Sandbox/tmp/logs"
for file in ${LOG_FILES}/* ; do
tar -cvzf "${file}.tar.gz" "$file"
done
我不是你的要求完全清楚,但我觉得您的问题是,你提供太多的路径信息焦油。比方说你有下列文件:
/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试图在存档中保留路径,这样当你提取一个tar包时,所有东西都会被重建(例如,如果你想压缩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
,在你的脚本可以是一个问题后。为了解决这个问题,你可以使用一个子shell:
#!/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
将愉快地压缩多个输入到多个输出,所以如果你想要一个班轮你可以只用
gzip -k "${LOG_FILES}"/*
去而且,如果y你有GNU并行安装,你可以并行压缩文件,如
parallel gzip -k ::: /Sandbox/tmp/logs/*