我正在尝试tar
收集名为“my_directory”的目录中的文件,并使用以下命令删除原始文件:
tar -cvf files.tar my_directory --remove-files
但是它只删除目录内的单个文件,而不是目录本身(这是我在命令中指定的)。我在这里遗漏了什么?
编辑:
是的,我认为“remove-files”选项是相当字面化的。尽管我也发现手册页对这一点不太清楚。(在 Linux 中,我往往不会真正区分目录和文件,有时会忘记它们不是一回事)。看起来大家的共识是它不会删除目录。
但是,我提出这个问题的主要原因是 tar 对绝对路径的处理。因为您必须指定要压缩的文件的相对路径,所以您必须切换到父目录才能正确地对其进行 tar。在我看来,在这种情况下使用任何类型的后续“rm”命令都可能很危险。因此,我希望通过让 tar 本身执行删除操作来简化事情。
例如,假设有一个备份脚本,其中要备份的目录(即 tar)作为 shell 变量包含。如果该 shell 变量值输入错误,则可能会导致从您最后所在的目录中删除文件。
答案1
--remove-files
你错过了说明选项删除的部分文件将它们添加到档案后。
您可以使用以下命令来跟踪存档和文件删除操作,
查找 /path/to/be/archived/ -depth -type d -empty -exec rmdir {} \;
更新:您可能有兴趣阅读这篇简短的 Debian 讨论,
Bug 424692:--remove-files 抱怨目录“在我们读取时发生了变化”。
答案2
由于--remove-files
选项仅删除文件,你可以尝试
tar -cvf files.tar my_directory && rm -R my_directory
tar
这样只有当返回退出状态 0时才会删除目录
答案3
您是否尝试过在存档名称后放置 --remove-files 指令?对我来说,这有效。
tar -cvf files.tar --remove-files my_directory
答案4
这可能是一个错误。
在这种情况下,“文件”一词也是含糊不清的。但因为这是一个命令行开关,所以我期望它也意味着目录,因为在 unix/lnux 中一切都是文件,也是目录。(当然,另一种解释也是有效的,但在这种情况下保留目录是没有意义的。我认为这是意料之外且令人困惑的行为。)
但我发现,在某些发行版中,gnu tar 实际上会删除目录树。另一个迹象表明保留目录树是一个错误。或者至少在他们修复它之前有一些解决方法。
这是我在 ubuntu 10.04 控制台上尝试的:
mit:/var/tmp$ mkdir tree1 mit:/var/tmp$ mkdir tree1/sub1 mit:/var/tmp$ > tree1/sub1/file1 mit:/var/tmp$ ls -la drwxrwxrwt 4 root root 4096 2011-11-14 15:40。 drwxr-xr-x 16 根 根 4096 2011-02-25 03:15.. drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1 mit:/var/tmp$ tar -czf tree1.tar.gz tree1/ --remove-files # 正如你所见,树已经不见了: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41。 drwxr-xr-x 16 根 根 4096 2011-02-25 03:15.. -rw-r--r-- 1 对应 159 2011-11-14 15:41 tree1.tar.gz mit:/var/tmp$ tar --version tar(GNU tar)1.22 版权所有 © 2009 自由软件基金会,Inc.
如果您想在您的机器上看到它,请将其粘贴到控制台中,风险自负:
tar --version cd /var/tmp mkdir -p tree1/sub1 > 树 1/子 1/文件 1 tar -czf tree1.tar.gz tree1/ --删除文件 ls-la