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

我所在的目录包含:

f0 f1 f2 .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 {} \;

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

感谢乡亲!

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

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

几乎可以使用,但是

  

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

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

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

xargs

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

  • find将从标准输入中读取的许多参数组合为较少数量的命令,但是对于可以形成 single 命令,这是您所需要的。如果超出了这些限制,那么find . -maxdepth 1 -type f | xargs tar cvf test.tar --remove-files 将调度多个命令,这将使您回到开始的位置。但是这些限制通常比示例案例所需的限制大得多。

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

本文链接:https://www.f2er.com/3159591.html

大家都在问