tar:压缩并删除原始文件,并保持目录不变

问题描述 投票:0回答:1

我在以下目录中:

f0f1f2.h1.h2.h3/ tmp

我想压缩所有文件并清除原始文件。我不想tar / tmp,也不想触摸其文件。在发布https://unix.stackexchange.com/questions/24870/tar-files-only-no-directories之后,似乎没有直接的方法可以执行此操作,因此我尝试了以下操作:

find . -maxdepth 1 -type f -exec tar cvf test.tar {} --remove-files \;

几乎可行:

-存档已创建

-删除所有文件

-/ tmp保持不变

但是

我的档案中只有文件f2(!)

尽管我找到了一个非常艰难的解决方案:

find . -maxdepth 1 -type f -exec tar cvf test.tar {} \; && find . -maxdepth 1 -type f ! -name '*.tar' -exec shred -xuvz {} \;

但是更优雅的东西将不胜感激。

感谢乡亲!

bash find tar
1个回答
1
投票
find . -maxdepth 1 -type f -exec tar cvf test.tar {} --remove-files \;

几乎可以使用,但是

我的档案中只有文件f2(!)

是,因为-exec命令是针对find发现的每个文件分别执行的,并且ctar选项使它每次都创建一个新的存档。

有几种方法可以解决此问题,但是对于数量不多的文件,可以将findxargs结合使用,以对find选择的所有文件运行单个命令:

find . -maxdepth 1 -type f | xargs tar cvf test.tar --remove-files

这是一个很好的模式,但确实有一些限制。特别是

  • xargs将把从其标准输入中读取的许多参数组合成较少数量的命令,但是在single命令中可以形成多少个参数有与系统和数据有关的限制。您需要什么。如果超出了这些限制,则xargs将分派多个命令,这将使您回到开始的位置。但是这些限制通常比示例情况所需的限制大得多。

  • 其中包含空格的文件名将破坏此模式,因为xargs通常将其输入拆分为空格。但是,如果有findxargs支持它,则可以通过一起使用-print0命令中的find谓词和-0xargs选项来解决此问题。当然,如果您没有任何此类文件名,那么这首先不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.