我在以下目录中:
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 {} \;
但是更优雅的东西将不胜感激。
感谢乡亲!
find . -maxdepth 1 -type f -exec tar cvf test.tar {} --remove-files \;
几乎可以使用,但是
我的档案中只有文件f2(!)
是,因为-exec
命令是针对find
发现的每个文件分别执行的,并且c
的tar
选项使它每次都创建一个新的存档。
有几种方法可以解决此问题,但是对于数量不多的文件,可以将find
与xargs
结合使用,以对find
选择的所有文件运行单个命令:
find . -maxdepth 1 -type f | xargs tar cvf test.tar --remove-files
这是一个很好的模式,但确实有一些限制。特别是
xargs
将把从其标准输入中读取的许多参数组合成较少数量的命令,但是在single命令中可以形成多少个参数有与系统和数据有关的限制。您需要什么。如果超出了这些限制,则xargs
将分派多个命令,这将使您回到开始的位置。但是这些限制通常比示例情况所需的限制大得多。
其中包含空格的文件名将破坏此模式,因为xargs通常将其输入拆分为空格。但是,如果有find
和xargs
支持它,则可以通过一起使用-print0
命令中的find
谓词和-0
的xargs
选项来解决此问题。当然,如果您没有任何此类文件名,那么这首先不是问题。