【问题标题】:archiving hidden directories with tar使用 tar 归档隐藏目录
【发布时间】:2011-01-01 02:13:40
【问题描述】:
目录mydir 上的

tar 将归档隐藏文件和隐藏的子目录,但使用* 通配符的within mydir 中的tar 不会。这是已知的不一致还是错误?

编辑:附加信息。 tar from within mydir 带有* 通配符将不会“看到”也不会归档 立即 目录中的隐藏文件和隐藏子目录。但是,在mydir 的非隐藏子目录中,隐藏文件和隐藏子目录将被归档。换句话说,在目录树的更深处,隐藏的对象将被归档。

【问题讨论】:

    标签: linux ubuntu tar hidden-files


    【解决方案1】:

    使用通配符将不起作用。您必须指定 . (当前目录)如果您的意思是包含隐藏文件的完整目录。你可以这样做

    tar -cvpzf test.tgz .
    

    【讨论】:

    • 但是要小心将新的 tar 文件放在你正在 tar 的同一个目录中。您可能会陷入令人讨厌的循环。
    • tar cvpfz test.tgz --exclude=*.tgz .
    • 或者把它放在别的地方:tar czpf /var/tmp/mytar.tgz ..
    • 把它放在其他地方可能意味着使用 sudo 这可能会在处理基于 GUI 的调度程序或 crontab 时导致额外的工作(您可能想要避免)。
    • 但您始终可以写入 /var/tmp。事实上,我通常就是这样做的。
    【解决方案2】:

    答案是* 通配符由shell 处理,它只是不会扩展到以点开头的东西。另一个通配符? 也不会扩展到以点开头的东西。感谢 Keith 指出它是执行扩展的 shell,因此它与 tar 无关。

    如果您使用shopt -s dotglob,则扩展将包括.filename 之类的内容。感谢安迪。

    使用shopt -u dotglob 将其关闭。

    切换dotglob 选项不会改变ls 本身。相反,它只是改变了 ls * 之类的扩展行为。

    编辑:我的建议在下面的评论中。

    【讨论】:

    • 这很有趣,但你能在示例命令中展示它吗?
    • @felwithe 通过使用shopt -s dotglob,您可以轻松地在要压缩其内容的目录中执行tar -cvpzf final.tar.gz * 之类的操作
    • @felwithe 我没有展示示例,因为我认为使用 * 通配符 tar 时会发生不明显的行为。我还认为使用 shopt 更改默认行为不是最理想的。也就是说,避免非显而易见的并避免非默认值。我决定如果可能的话,最好明确命名你想要 tar 的内容。
    【解决方案3】:

    你可以使用:

    tar -cvpzf test.tgz * .??*
    

    但是,这仅适用于名称 > 2 的隐藏文件(以防止出现 '.' 和 '..')

    【讨论】:

      【解决方案4】:

      您可以使用以下命令压缩当前目录(包括 .hidden)中的所有文件/文件夹:

      tar -zcvf compressed.tgz `ls -A -1`
      

      最后一个参数是您要压缩的文件夹。如果您将其传递给 ls -A -1 ,那么您将传递当前目录中的所有文件夹,但 ... 除外。 对于子目录,默认情况下,.hidden 文件已经包含在压缩中。

      【讨论】:

        【解决方案5】:

        shell 扩展了通配符,因此 tar 甚至看不到它。如果你想这样做,你必须明确地添加它们。 (.*)。但是,最常见的做法是对单个目录进行 tar,以便在解压缩时将所有目录都放到同一个位置。

        【讨论】:

        • 实际上 .* 上的 tar 会上升(可能和根一样高)所以你可能不想这样做。
        • 更正:不如root高。
        • 哦,对了。使用.[a-zA-Z]* 之类的东西会更安全。但是,我总是喜欢只 tar 一个目录(如果需要,是父目录)。
        • 此评论讨论了 tar 和 ls (list) 命令,这在此字体中很难看到。 shell 可能负责扩展 * 通配符。然而,对于 .通配符 tar 和 ls 的行为不同,所以我不知道 shell 在点的情况下是否提供了一致的行为。 ls 。忽略隐藏的东西(与 tar 不一致)和 ls -a 。可以看到 .. (上图)目录,该目录也与 tar 将归档的内容不一致。 tar 只会随着 a 下降。除非你这样做 .* 我们已经讨论过。
        • 点(.) 不是shell globbing 中的通配符。它是当前目录的名称。旧系统甚至有一个物理目录条目.。因此它是一致的,因为外壳不会扩展它。
        【解决方案6】:
        shopt -s dotglob
        

        这将使

        【讨论】:

        • 欢迎来到 StackOverflow!你忘了完成你的消息吗?
        • Keith 在他的一个 cmets 中解释了这个答案。
        【解决方案7】:

        这将压缩所有隐藏的文件和目录

        tar -cvzf hidden.tgz `ls -a | egrep [.][^.]+`
        

        【讨论】:

          猜你喜欢
          • 2013-12-27
          • 1970-01-01
          • 1970-01-01
          • 2014-10-27
          • 2015-07-10
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多