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

Ear*_*ind 18 bash tar gzip

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

例子:

directory
 subdir1
 subdir2
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ano 30

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

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

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

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

Chr*_*rel 12

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

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

  • 单独的 gzip 不会归档目录 (3认同)
  • 错误:“查找:路径必须在表达式之前:;” 第一部分有效,所以我使用(仅限目录):`for dir in \`find * -maxdepth 0 -type d\`; 做 tar -cvzf ${dir}.tar.gz ${dir}; 完成` (3认同)

Phi*_*lds 5

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

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • ls 和 find 都不能以这种方式使用。特别是 ls,它旨在将文件显示在用户可读的列表中,而不是生成文件列表作为 'for' 的参数。只需使用`for dir in *` (3认同)