【问题标题】:How to avoid clobbering files when creating a tar archive创建 tar 存档时如何避免破坏文件
【发布时间】:2010-11-10 12:19:51
【问题描述】:

This question 注意到在创建 tar 存档时可能会覆盖文件,我正在尝试了解如何避免这种情况。

通常我会使用文件滚轮,但安装的版本有点高(使用 1.1 Gb 内存),而且我不是系统管理员。

我查看了 --confirmation 和 --interactive,但它只询问我是否要将文件 x 添加到存档中,而不是是否要覆盖现有文件。例如,

tar --interactive -czvf innocent_text_file.txt foo*

会询问我有关每个文件的信息,但很乐意覆盖无辜_text_file.txt

有没有类似 -i for cp 的开关?

注意我问的是创建档案,而不是提取档案。

澄清我担心的是不小心做了这样的事情

tar -czvf * #Don't do this!

这将覆盖 glob 中列出的第一个文件。为了避免这种情况,如果提到的第一个文件已经存在,我希望 tar 抱怨,比如

cp -i * #Don't do this!

会检查它是否会导致您覆盖现有文件。

【问题讨论】:

    标签: tar confirm overwrite


    【解决方案1】:

    如果我正确理解了您的问题,这应该可以解决问题

    -k, --keep-old-files 保留现有文件;不要从存档中覆盖它们

    【讨论】:

    • 似乎不起作用。当给出用于归档 creation 的错误 tar 命令时,innocent_text_file.txt 将被覆盖。
    • --keep-old-files 选项仅用于提取
    【解决方案2】:

    “u”(更新)而不是“c”(创建)呢?例如,tar -uzvf

    仅当文件比存档中的文件新时才应添加(并覆盖)文件。

    【讨论】:

    • 对不起,这也无济于事。
    【解决方案3】:

    这些是在从 tar提取时覆盖控件。

    Overwrite control:
    
    -k, --keep-old-files  don't replace existing files when extracting
      --keep-newer-files  don't replace existing files that are newer than
                          their archive copies
      --no-overwrite-dir  preserve metadata of existing directories
      --overwrite         overwrite existing files when extracting
      --overwrite-dir     overwrite metadata of existing directories when
                          extracting (default)
      --recursive-unlink  empty hierarchies prior to extracting directory
      --remove-files      remove files after adding them to the archive
    

    但是,您参考cp -itar c操作以供参考。
    这意味着您有兴趣更新不 用新版本覆盖 tar 中的现有副本。我怀疑 tar 不能直接使用控制。
    我也想知道是否需要这样的计划。

    但是,解决此问题的一种方法如下。
    因为,您担心会覆盖存档,
    我们安全地假设您有一个现有的部分 tar 目录(比如 files.tar)。

    cd base/dir/to/be/tarred 
    tar tf path/to/files.tar | sort > archived-files.lst
    find . -type f | sort > files.lst
    diff archived-files.lst files.lst | grep "^>" | cut -c 3- > new.lst
    tar uf -T new.lst
    

    请注意,此 update 仅适用于未压缩的存档。
    因此,如果您的存档是压缩 gunzip/bunzip2,则在此序列之前适当地使用它。
    然后在最后重新压缩。

    【讨论】:

    • 我问的是存档的创建,而不是提取。
    • 是的,我想,但这听起来像是一个不寻常的要求。即使文件在活动目录中被修改/更新,您真的想在存档中保留文件的第一个副本吗?
    • 我在原始问题的末尾添加了一个说明。现在更有意义了吗?
    • 关于clobbering 现有文件由于在命令行上错误地遗漏了目标存档名称,我记得tar 曾经在使用c 选项创建时避免这样做。但是,快速检查我当地的 Cygwin 并没有这样做。我很惊讶。
    • 顺便说一句,Unix 命令提示符是一个圣地。当你是 root/admin 时更是如此。它不会原谅并帮助你忘记。我记得我们大学的常驻根过去常常在深夜喝醉时断然避免根壳!
    【解决方案4】:

    如果我正确理解您的问题,我相信这应该是诀窍:

    tar -cv * | gzip > myfile.tgz

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2011-09-26
      • 1970-01-01
      • 2020-02-29
      • 2015-04-02
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多