【问题标题】:for each dir create a tar file为每个目录创建一个 tar 文件
【发布时间】:2013-04-10 20:43:57
【问题描述】:

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

到目前为止的尝试:

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

【问题讨论】:

  • 如果有办法明确列出它们......是的。
  • 如果这有助于使其成为可能,他们将独自在自己的目录中。
  • tink 可能要告诉您的是,SO 不是“为我编写脚本”网站。到目前为止,您尝试过什么?
  • 你的脚本有什么问题?

标签: linux bash shell


【解决方案1】:

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

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

find . -maxdepth 1 -mindepth 1 -type d

这个对每个执行一个 tar:

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

【讨论】:

  • 添加``以删除归档后的原始目录:find . -maxdepth 1 -mindepth 1 -type d -exec tar cvf {}.tar {} --remove-files \;
  • 压缩find . -type d -maxdepth 1 -mindepth 1 -exec tar zcvf {}.tar.gz {} \;
  • -mindepth 1 也很重要,否则您首先要处理的是.,即当前目录。
【解决方案2】:

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

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

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

然后您可以查看输出,看看它是否在执行您想要的操作。确定程序可以运行后,编辑命令行并删除echo 命令。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      使用 GNU Parallel 简单且并行地完成所有操作:

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

      如果您想在不实际执行任何操作的情况下检查它将做什么,请像这样添加--dry-run

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

      样本输出

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

      【讨论】:

        【解决方案5】:

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

        执行第一条语句后

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

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

        【讨论】:

          猜你喜欢
          • 2021-03-26
          • 2015-08-29
          • 2011-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多