30

我有一堆需要恢复的目录,但必须先将它们打包成 .tar。是否有一个脚本可以让我将所有 100 多个目录打包到他们自己的 tar 中,这样 dir 就变成了 dir.tar。

到目前为止尝试:

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

5 回答 5

75

如果目录名称中有一些空格,则您编写的脚本将不起作用,因为名称将被拆分,并且如果文件存在于此级别,它也会 tar 文件。

您可以使用此命令不递归地列出目录:

find . -maxdepth 1 -mindepth 1 -type d

而这个对每个执行一个 tar :

find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {}  \;
于 2013-04-10T23:55:16.407 回答
6

您在该级别是否有任何带有空格的目录名称?如果没有,您的脚本将正常工作。

我通常做的是编写一个脚本,其中包含我要执行的命令回显:

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

然后你可以查看输出,看看它是否在做你想做的事。确定程序可以运行后,编辑命令行并删除echo命令。

于 2013-04-11T00:48:03.510 回答
4

如果目录名称中有空格,则只需将变量放在双引号内:

for i in *
 do
     tar czf "$i.tar" "$i"
 done
于 2014-07-09T13:42:07.810 回答
2

用GNU Parallel简单地和并行地完成它们:

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

如果你想在不实际做任何事情的情况下检查它会做什么,添加--dry-run如下:

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

样本输出

tar -cf ab.tar ab
tar -cf cd.tar cd
于 2019-10-10T14:46:05.237 回答
1

如果目录数量很大并且它们的名称太长

在执行第一条语句后

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

你会得到错误“字符串太长”

于 2013-05-05T08:01:34.930 回答