2017-02-10 129 views
1

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

回答

1

我不是你的要求完全清楚,但我觉得的问题是,你提供太多的路径信息焦油。比方说你有下列文件:

/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.txtbaz.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/*