如何压缩目录,然后删除包含目录的原始文件?


28

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

tar -cvf files.tar my_directory --remove-files

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

编辑:

是的,我想'remove-files'选项是完全文字的。尽管我也发现手册页在这一点上不清楚。(在linux中,我往往不会在目录和文件之间真正区分太多,有时会忘记它们不是同一件事)。看来共识是它不会删除目录。

但是,我提出这个问题的主要提示是因为tar对绝对路径的处理。由于必须指定要压缩文件的相对路径,因此必须更改到父目录以正确压缩它。如我所见,在这种情况下,使用任何类型的后续“ rm”命令都可能存在危险。因此,我希望通过使tar自己执行删除操作来简化操作。

例如,想象一个备份脚本,其中要备份的目录(即tar)作为shell变量包含在内。如果错误输入了该shell变量值,则可能会从您恰好位于的目录中删除文件。


Nicholas,您的观点是,必须在额外的步骤中删除目录树会增加危险,这是绝对正确的。我认为存档程序可以安全地完成此操作。我也相信这是GNU tar的创建者的意图,至少它应该是;-)
mit

2
我发现--remove-files选项确实删除了包含的目录-至少在某些平台上/在某些版本中-对于我而言。可能是因为您的情况下,由于某些文件被压缩后才被修改,所以剩余的dir并非完全为空。
isync 2012年

@isync我似乎正在遇到--remove-files删除Ubuntu 14.04上的目录。除了我自己的情况,我不希望这样做。哈哈
布拉德利·奥德尔

Answers:


12

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

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

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


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


也许实际上是这样:-ctar开始工作之前更改目录(并且直到完成后才会返回)。我如果子目录包含在存档中,那么它会删除子目录(但是我没有测试过)。
Arjan 2010年

@Arajan,我认为“ c'与此无关”;'remove-files'故意不删除目录。
2010年

啊哈,我发现简短的解释“将文件添加到存档后删除文件”在man页面上并不清楚,但是我认为您是对的。不过,我不希望所提到的目录-c被删除,甚至如果 tar没有删除目录以及。(对我来说,这就像删除当前目录,因此在使用-c... 时包括归档文件本身。)但是,如果-remove-files始终将目录保留在原处,那么我肯定会使这里的事情变得复杂。;-)
Arjan 2010年

3
--remove-files错误已修复tar-1.19
x-yuri

18

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

tar -cvf files.tar my_directory && rm -R my_directory

因此,仅当tar返回的退出状态为0时,才删除目录


9
除了在执行rm之前应检查tar的退出状态外!否则,您可能会没有tar存档和文件...
Kim

1
当使用一级目录时,我相信一个更安全的选择是使用“ rmdir”而不是“ rm”,因为它只会删除一个空目录。[查看问题编辑]
尼古拉斯

但是rmdir只删除目录。想法是删除目录及其中的文件(假设tar已成功完成)
pavium 2010年

--remove-files错误已修复tar-1.19
x-yuri

5

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

tar -cvf files.tar --remove-files my_directory

1
自从提出这个问题以来,焦油的行为更有可能发生了变化。对我来说,放在--remove-files前面或后面没有区别my_directory;在这两种情况下,都将删除目录。
redburn

4
--remove-files错误已修复tar-1.19
x-yuri

1
source={directory argument}

例如

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

例如

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

然后,您可以执行以下操作:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

这可能是一个错误。

在这种情况下,“文件”一词也是不明确的。但是因为这是一个命令行开关,所以我希望它也表示目录,因为在unix / lnux中,所有内容都是文件,也是目录。(另一种解释当然也有效,但是在这种情况下保留目录是没有意义的。我认为这是意外的和令人困惑的行为。)

但是我发现在某些发行版的gnu tar中,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根根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 /-删除文件

#正如您所看到的,树已不复存在:

mit:/ var / tmp $ ls -la
drwxrwxrwt 3根根4096 2011-11-14 15:41。
drwxr-xr-x 16根根4096 2011-02-25 03:15 ..
-rw-r--r-- 1 mit mit 2011年11月14日15:41 tree1.tar.gz                                                                   


mit:/ var / tmp $ tar --version                                                                                             
焦油(GNU焦油)1.22                                                                                                           
版权所有©2009自由软件基金会,公司。

如果要在计算机上查看它,请将其粘贴到控制台中,后果自负:

tar-版本                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 /-删除文件
ls -la
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.