我想收集我在项目中使用过的所有文件。我正在使用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)
它应该做正确的事情。
您只需要-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
.