2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32

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

我试图tar在一个名为'my_directory'的目录中的文件集合,并使用命令删除原文件。

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

然而它只删除了目录中的单个文件,而不是目录本身(这是我在命令中指定的)。我在这里遗漏了什么?

编辑:

是的,我想 “remove-files "选项的字面意思是相当清楚的。虽然我也发现手册页面对这一点并不清楚。(在linux中,我倾向于不怎么区分目录和文件,有时会忘记它们不是一回事)。看起来大家都认为它不会删除目录。

然而,我问这个问题的主要提示点来自于tar对绝对路径的处理。因为你必须为要压缩的文件/s指定一个相对路径,因此你必须改变到父目录才能正确地压缩它。在我看来,在这种情况下,使用任何一种后续的 "rm "命令都是潜在的危险。因此,我希望通过让 tar 本身进行删除来简化事情。

例如,想象一个备份脚本,其中要备份的目录(即tar)是作为一个shell变量包含的。如果这个shell变量的值输入得不好,结果有可能是删除了你最后碰巧在哪个目录下的文件。

答案 (5)

19
19
19
2010-01-17 11:58:18 +0000

由于--remove-files选项只_删除文件,你可以尝试

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

,这样只有当tar返回退出状态为0时,目录才会被删除。

12
12
12
2010-01-17 11:42:11 +0000

你缺少了--remove-files选项在将**文件添加到存档后删除它们的部分。

你可以用类似

find /path/to/be/archived/ -depth -type d -empty -exec rmdir {}这样的命令来跟踪存档和文件删除操作。\;


更新:你可能有兴趣阅读这个简短的Debian讨论, Bug 424692: –remove-files抱怨目录 “在我们读取时发生了变化” .

7
7
7
2014-11-12 10:15:09 +0000

你有没有试过把–remove-files指令放在存档名称后面?这对我来说是有效的。

tar -cvf files.tar --remove-files my_directory
1
1
1
2010-10-04 19:58:41 +0000
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
1
1
2011-11-14 13:21:38 +0000

这可能是一个bug。

另外,"文件 “这个词在这种情况下是有歧义的。但是因为这是一个命令行开关,我认为它也应该是指目录,因为在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 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 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 # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. -rw-r--r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz mit:/var/tmp$ tar --version tar (GNU tar) 1.22 Copyright © 2009 Free Software Foundation, Inc.

如果你想在你的机器上看到它,请把这个粘贴到控制台,风险自负:

tar --version cd /var/tmp mkdir -p tree1/sub1 \> tree1/sub1/file1 tar -czf tree1.tar.gz tree1/ --remove-files ls -la
``` 0x1&