如何对目录进行 tar 压缩然后删除包括该目录在内的原始文件?

如何对目录进行 tar 压缩然后删除包括该目录在内的原始文件?

我正在尝试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

相关内容