我有一堆需要恢复的目录,但必须先将它们打包成 .tar。是否有一个脚本可以让我将所有 100 多个目录打包到他们自己的 tar 中,这样 dir 就变成了 dir.tar。
到目前为止尝试:
for i in *; do tar czf $i.tar $i; done
如果目录名称中有一些空格,则您编写的脚本将不起作用,因为名称将被拆分,并且如果文件存在于此级别,它也会 tar 文件。
您可以使用此命令不递归地列出目录:
find . -maxdepth 1 -mindepth 1 -type d
而这个对每个执行一个 tar :
find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {} \;
您在该级别是否有任何带有空格的目录名称?如果没有,您的脚本将正常工作。
我通常做的是编写一个脚本,其中包含我要执行的命令回显:
$ for i in *
do
echo tar czf $i.tar $i
done
然后你可以查看输出,看看它是否在做你想做的事。确定程序可以运行后,编辑命令行并删除echo
命令。
如果目录名称中有空格,则只需将变量放在双引号内:
for i in *
do
tar czf "$i.tar" "$i"
done
用GNU Parallel简单地和并行地完成它们:
parallel tar -cf {}.tar {} ::: *
如果你想在不实际做任何事情的情况下检查它会做什么,添加--dry-run
如下:
parallel --dry-run tar -cf {}.tar {} ::: *
样本输出
tar -cf ab.tar ab
tar -cf cd.tar cd
如果目录数量很大并且它们的名称太长
在执行第一条语句后
for i in *
do
echo tar czf $i.tar $i
done
你会得到错误“字符串太长”