如何tar目录然后删除包括目录在内的原始文件?

Nic*_*las 42 linux tar

我正在尝试tar在名为“my_directory”的目录中收集文件并使用以下命令删除原件:

tar -cvf files.tar my_directory --remove-files
Run Code Online (Sandbox Code Playgroud)

但是,它仅删除目录中的单个文件,而不删除目录本身(这是我在命令中指定的内容)。我在这里缺少什么?

编辑:

是的,我认为 'remove-files' 选项是相当直白的。虽然我也发现手册页在这一点上不清楚。(在 linux 中,我往往不会真正区分目录和文件,有时会忘记它们不是一回事)。看起来共识是它不会删除目录。

但是,我提出这个问题的主要提示点源于 tar 对绝对路径的处理。因为您必须指定要压缩的文件的相对路径,因此您必须更改到父目录以正确地对其进行 tar。正如我所见,在这种情况下,使用任何类型的后续“rm”命令都有潜在危险。因此,我希望通过让 tar 本身进行删除来简化事情。

例如,想象一个备份脚本,其中要备份的目录(即 tar)作为 shell 变量包含在内。如果该 shell 变量值输入错误,则结果可能是从您上次碰巧所在的任何目录中删除文件。

pav*_*ium 25

由于该--remove-files选项仅删除文件,您可以尝试

tar -cvf files.tar my_directory && rm -R my_directory
Run Code Online (Sandbox Code Playgroud)

以便仅当tar返回退出状态为 0时才删除目录

  • 除了你应该在执行 rm 之前检查 tar 的退出状态!否则你可能没有 tar 存档,也没有文件...... (10认同)
  • 如果前一个命令退出 0(成功),&& 将仅运行以下命令。如果退出> 0,则不会运行以下命令。您还可以使用 || 反转它 -- 仅在第一个命令失败时运行。进行糟糕内容检查的好方法是重新启动该内容。 (2认同)

nik*_*nik 19

您缺少表示该--remove-files选项在将文件添加到存档后删除文件的部分。

您可以使用以下命令执行存档和文件删除操作,

find /path/to/be/archived/ -depth -type d -empty -exec rmdir {} \;


更新:您可能有兴趣阅读关于 Debian 的简短讨论,
错误 424692:--remove-files 抱怨目录“在我们阅读时发生了变化”

  • `--remove-files` 错误已在 [`tar-1.19`](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=424692#14) 中修复。 (5认同)

小智 9

您是否尝试在存档名称之后放置 --remove-files 指令?这个对我有用。

tar -cvf files.tar --remove-files my_directory
Run Code Online (Sandbox Code Playgroud)

  • `--remove-files` 错误已在 [`tar-1.19`](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=424692#14) 中修复。 (5认同)
  • 自从提出这个问题以来,tar 的行为更有可能发生了变化。对我来说,将 `--remove-files` 放在 `my_directory` 之前或之后没有区别;在这两种情况下,目录都会被删除。 (2认同)