修改 zsh 通配模式以与 cp 一起使用

Lor*_*sum 5 zsh shell-script file-copy patterns glob

我想编写一个脚本来从一个特定的文件夹递归复制文件除文件A.extnB/*.extnC/*在那里BC在目录和extn仅仅是一些通用的扩展。这就是我所拥有的:

#!/usr/local/bin/zsh
setopt EXTENDED_GLOB
TMPDIR=/tmp/test

cp -pR $(dirname $0)/**~(*.foo/*|*/bar.txt|*.abc|qux.txt) $TMPDIR
Run Code Online (Sandbox Code Playgroud)

然而,这并没有像预期的那样否定模式。我想我知道为什么——尽管模式是正确的(如 所示echo),但cp -R不知道该模式,并进入了一个“不应该”的目录,一旦进入,该模式就不再有效。

如何修改上述内容以执行我想要的操作?我想用findand是可能的xargs,但我被上面的清晰度所吸引,并且更喜欢类似的东西(但如果这是错误的方法,我会非常满意不同的解决方案)。

qqx*_*qqx 2

您是正确的,该模式在运行之前已扩展cp,因此该命令未知。

您可以通过使用--parents选项 tocp而不是 来完成您想要的任务-R。这只会复制与您的模式匹配的文件,但将使用提供的完整路径名,而不仅仅是尾随文件名。

但是,这个选项不可移植。AFAIK,只有 GNU 版本的 cp 支持它。