对于每个目录创建一个tar文件。

36

我有一堆需要恢复的目录,但它们必须首先被打包成一个.tar文件。是否有一个脚本可以让我将所有100多个目录打包成它们自己的tar文件,所以目录变成目录.tar。

目前尝试过的方法:

for i in *; do tar czf $i.tar $i; done

2
如果有一种明确列出它们的方法...是的。 - tink
如果这有助于实现,他们可以独立于自己的目录。 - Amanada Smith
2
Tink可能想告诉你的是,SO不是一个“为我编写脚本”的网站。你到目前为止尝试了什么? - Ansgar Wiechers
1
你的脚本有什么问题? - parkydr
5个回答

82
您编写的脚本如果目录名中有空格,则无法正常工作,因为名称将被分割,并且如果该级别存在文件,它也将对文件进行压缩。
您可以使用以下命令来列出非递归目录:
find . -maxdepth 1 -mindepth 1 -type d

并对每个执行tar操作:

find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {}  \;

4
为了归档原目录并删除它们,可以添加``:find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {} --remove-files \; - xb.
16
压缩命令: find . -type d -maxdepth 1 -mindepth 1 -exec tar zcvf {}.tar.gz {} \; 意思是在当前目录下,找到所有的文件夹(排除当前目录),对每个文件夹进行压缩,压缩后的文件名为原文件夹名加上".tar.gz"后缀。 - Bernhard Döbler
“-mindepth 1”也很重要,否则你将首先处理“.”,即当前目录。 - dthor

7

您在该级别是否有任何带空格的目录名称?如果没有,您的脚本将完美运行。

我通常会编写一个脚本,其中包含我想要执行的命令:

$ for i in *
do
    echo tar czf $i.tar $i
done

然后,您可以查看输出并查看它是否符合您的要求。在确定程序将正常工作后,编辑命令行并删除echo命令。


4
如果目录名称中有空格,则只需将变量放在双引号内即可:
for i in *
 do
     tar czf "$i.tar" "$i"
 done

3

使用GNU Parallel可以简单地并行完成所有任务:

parallel tar -cf {}.tar {} ::: *

如果您想在不实际执行任何操作的情况下检查它将要做什么,请添加--dry-run,如下所示:
parallel --dry-run tar -cf {}.tar {} ::: *

示例输出

tar -cf ab.tar ab
tar -cf cd.tar cd

1
如果目录数量非常大且它们的名称过长,在执行语句一之后。
  for i in *
    do
     echo tar czf $i.tar $i
    done

你会收到错误信息 "字符串过长"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接