Linux将多个子目录gzip压缩到单独的档案中?


16

如何将子目录压缩到单独的档案中?

例:

directory
 subdir1
 subdir2

应该创建subdir1(.tar).gz和subdir2(.tar).gz

Answers:


27

鉴于您的要求,此小脚本似乎是您的最佳选择:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

它可以正确处理名称中带有空格的目录。


它给了我这个错误:bash:-c:第1行:语法错误:文件意外结束
EarthMind

@EarthMind:在这里工作正常。检查脚本是否正确复制。

@EarthMind:我不确定您是否很好地阐明了原始问题。您想再次运行此文件并获取新的.tar.gz文件,而又不保留先前的.tar.gz文件吗?尝试添加“ tmstamp = $(date'+%Y%m%d-%H%M')”,然后将$ {base}更改为$ {base}-$ {tmstamp}。
自由报

2
@EarthMind:如果要将所有内容放在一行中,请确保在tar命令之前有一个分号(;)。否则,将base作为环境变量传递给tar,而不是作为shell辅助变量。
朱利诺2009年

@mwojtera您尝试的编辑应该是它自己的答案
小鸡

10

这个怎么样: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

说明:您在当前目录中的所有项目上运行查找。Maxdepth 0使其不递归低于给定的参数。(在这种情况下,*或当前目录中的所有项目)“ -type”的'd'参数仅与目录匹配。然后exec在任何匹配项上运行tar。({}被匹配文件替换)


1
但是,我仍然收到以下错误:给定的路径是目录而不是文件
EarthMind

3
仅gzip不会存档目录
Juliano

您需要先对tar目录进行压缩,然后才能对其进行gzip压缩。
ℝaphink

1
您需要使用带有z选项的tar,而不是用于目录的直接gzip。不过,find的用法非常好。
自由报

3
错误:“查找:路径必须在表达式之前;”;第一部分有效,因此我使用了(仅限目录): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK

4

这将为名为blah的目录中的每个文件创建一个名为blah.tar.gz的文件。

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

如果您不仅在目录中拥有目录(例如,文件,因为ls将返回目录中的所有内容),也可以使用以下命令:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

grep -v排除当前目录,find默认情况下该目录将显示在命令中。


3
ls和find都不以这种方式使用。特别是ls,它旨在将文件呈现在用户可读的列表中,而不是生成文件列表作为“ for”的参数。只需使用for dir in *
Juliano,

1
我已经尝试过您的第一个建议,但不适用于名称中包含空格的目录
EarthMind

此外,第一个命令还将为目录中的每个文件创建一个tarball。
phaphink
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.