如何查找文件列表并将它们压缩为单个 zip 文件?

cod*_*bie 2 find

我想收集我在项目中使用过的所有文件。我正在使用find命令,我希望它找到一个文件列表,然后将其结果传递给 zip 命令以创建一个包含所有匹配文件的 zip 文件。如果可能的话,只是为了方便。但是,它似乎存在问题并且不起作用。

find /lmms/samples/ -name warp01*,JR_effect2k*,clean_low_key*,q_kick_2*,sticky_q_kick*,upright_bass*,pizzi*,chorded_perc*,Tr77_kick*,Tr77_tom1*,Tr77_cym*,hihat_008a*,Hat_o.ds,Hat_c.ds,Kickhard.ds,Tr77_snare* -exec zip {} ~/Desktop/files.zip
Run Code Online (Sandbox Code Playgroud)

输出是:

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

附注。

在修复了以下答案中指出的一些错误并遵循他们的指导方针后,我将代码重新格式化如下:

find ~/lmms/samples/ (-name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*)  -exec zip -add  ~/Desktop/files.zip {} +
Run Code Online (Sandbox Code Playgroud)

它仍然失败并显示消息bash: syntax error near unexpected token(' `

删除括号消除了错误,但似乎只向存档添加了一个文件,令人惊讶的是,我的桌面上似乎没有找到!!!

 find ~/lmms/samples/ -name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*  -exec zip  ~/Desktop/files.zip {} +
  adding: home/john/lmms/samples/drumsynth/tr77/Tr77_snare.ds (deflated 49%)
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 11

-exec有两个参数:要执行的命令,以及一个标志,用于find判断命令是应该每次匹配运行一次 ( ;) 还是每次运行时使用尽可能多的文件 ( +)。

此外,zip参数是错误的方式。

-name测试不工作的方式要么; 一次只需要一种模式。如果要检查多个模式,则需要-name使用-o("or")组合使用多个测试,并将它们括在括号中(感谢xhienne指出这一点):

find /lmms/samples/ \( -name "warp01*" -o -name "JR_effect2k*" ... \) -exec ...
Run Code Online (Sandbox Code Playgroud)

(引用每个模式以避免 shell globbing 出现问题)。

总而言之,如果你修复了你的名字测试并find

-exec zip ~/Desktop/files.zip {} +
Run Code Online (Sandbox Code Playgroud)

它应该做正确的事情。

  • 如果你不想存储路径,你可以使用 `zip` 的 `-j` 选项来删除它们。您需要确保在不同目录中没有两个(或更多)同名文件! (2认同)

xhi*_*nne 5

您只需要-exec使用 a;或 a +( man find)来终止您的选项。您的zip文件必须在您放入存档 IIRC 的文件之前,因此这将变为:

find ... -exec zip ~/Desktop/files.zip {} ;
find ... -exec zip ~/Desktop/files.zip {} +
Run Code Online (Sandbox Code Playgroud)

+版本在zip命令的末尾聚合参数,并zip为所有文件调用一个(zip如果您的命令很长,则调用几个)。它的 I/O 密集程度较低,但缺点是您只能使用{}一次,并且在最后,就在+. 该;版本更灵活,但需要调用zip每个文件。

没有找到的替代解决方案

您的-name谓词也有问题,@StephenKitt 为您提供正确的语法。

这是另一种语法,它使用zip的能力来理解像file*. 因此它不使用find,更接近您的原始提案,并且对于不习惯的人来说可能不太容易出错find

$ zip -r  ~/Desktop/files.zip /lmms/samples/ --include 'warp01*' 'JR_effect2k*' 'clean_low_key*' 'q_kick_2*' 'sticky_q_kick*' 'upright_bass*' 'pizzi*' 'chorded_perc*' 'Tr77_kick*' 'Tr77_tom1*' 'Tr77_cym*' 'hihat_008a*' 'Hat_o.ds' 'Hat_c.ds' 'Kickhard.ds' 'Tr77_snare*'
Run Code Online (Sandbox Code Playgroud)

注意:图案用空格分隔。它们周围的引号是强制性的,否则模式可能会由您的 shell 解释,而不是由zip.