首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅压缩文件

仅压缩文件
EN

Stack Overflow用户
提问于 2017-02-11 04:42:44
回答 1查看 45关注 0票数 1

我想有一个脚本,将压缩所有的文件(使用tar)在“日志”目录(Sandbox/tmp/logs)。不知道哪里出错了,但它正在压缩所有的文件、目录和路径。我可不想这样。我只想压缩"log“目录中的文件。任何帮助都将不胜感激。

下面是我的代码:

代码语言:javascript
复制
#!/bin/bash

LOG_FILES="/Sandbox/tmp/logs"

for file in ${LOG_FILES}/* ; do
   tar -cvzf "${file}.tar.gz" "$file"
done
EN

回答 1

Stack Overflow用户

发布于 2017-02-11 10:44:55

我不完全清楚您在问什么,但我认为您的问题是您向tar提供了太多的路径信息。假设您有以下文件:

代码语言:javascript
复制
/Sandbox/tmp/logs/foo
/Sandbox/tmp/logs/bar
/Sandbox/tmp/logs/baz

您所拥有的基本上将运行以下命令:

代码语言:javascript
复制
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,那么当您解压它们时,您可能希望bar.txt位于foo子目录中)。

解决这个问题最简单的方法就是去掉路径…在循环外将目录更改为/Sandbox/tmp/logs应该可以做到这一点:

代码语言:javascript
复制
#!/bin/bash

LOG_FILES="/Sandbox/tmp/logs"

cd "${LOG_FILES}"

for file in * ; do
   tar -cvzf "${file}.tar.gz" "$file"
done

这样,您将得到以下新文件:

代码语言:javascript
复制
/Sandbox/tmp/logs/foo.tar.gz
/Sandbox/tmp/logs/bar.tar.gz
/Sandbox/tmp/logs/baz.tar.gz

但是,您现在仍然在/Sandbox/tmp/logs中,这可能会在稍后的脚本中出现问题。为了解决这个问题,你可以使用子subshell:

代码语言:javascript
复制
#!/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的繁琐:

代码语言:javascript
复制
#!/bin/bash

LOG_FILES="/Sandbox/tmp/logs"

for file in "${LOG_FILES}"/*; do
   gzip -k "$file"
done

这将会产生

代码语言:javascript
复制
/Sandbox/tmp/logs/foo.gz
/Sandbox/tmp/logs/bar.gz
/Sandbox/tmp/logs/baz.gz

而且gzip会很乐意地将多个输入压缩成多个输出,所以如果你想要一行代码,你可以使用

代码语言:javascript
复制
gzip -k "${LOG_FILES}"/*

而且,如果您安装了GNU parallel,则可以使用以下命令并行压缩文件

代码语言:javascript
复制
parallel gzip -k ::: /Sandbox/tmp/logs/*
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42168346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档