我有一堆需要恢复的目录,但必须先将它们打包成.tar。是否有一个脚本允许我将所有100多个目录打包到他们自己的tar中,因此dir变为dir.tar。
到目前为止尝试:
for i in *; do tar czf $i.tar $i; done
答案 0 :(得分:44)
如果目录名中有一些空格,那么您编写的脚本将无法工作,因为该名称将被拆分,如果它们存在于此级别,它也会tar文件。
您可以使用此命令以递归方式列出目录:
find . -type d -maxdepth 1 -mindepth 1
和这个在每一个上执行tar:
find . -type d -maxdepth 1 -mindepth 1 -exec tar cvf {}.tar {} \;
答案 1 :(得分:6)
您是否在该级别有任何包含空格的目录名称?如果没有,您的脚本将正常工作。
我通常做的是用我想要执行的命令编写一个脚本:
$ for i in *
do
echo tar czf $i.tar $i
done
然后你可以查看输出,看看它是否正在做你想要的。在确定程序可以运行后,编辑命令行并删除echo
命令。
答案 2 :(得分:2)
如果目录名中有空格,则只需将变量放在双引号中:
for i in *
do
tar czf "$i.tar" "$i"
done
答案 3 :(得分:1)
如果目录数量非常大且名称太长
执行第一号陈述后
for i in *
do
echo tar czf $i.tar $i
done
你会收到错误“字符串太长”
答案 4 :(得分:1)
通过 GNU Parallel 并行完成所有任务:
parallel tar -cf {}.tar {} ::: *
如果您想在不做任何实际操作的情况下检查它会做什么,请像这样添加--dry-run
:
parallel --dry-run tar -cf {}.tar {} ::: *
示例输出
tar -cf ab.tar ab
tar -cf cd.tar cd