Lor*_*sum 5 zsh shell-script file-copy patterns glob
我想编写一个脚本来从一个特定的文件夹递归复制文件除文件A.extn
,B/*.extn
并C/*
在那里B
和C
在目录和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
不知道该模式,并进入了一个“不应该”的目录,一旦进入,该模式就不再有效。
如何修改上述内容以执行我想要的操作?我想用find
and是可能的xargs
,但我被上面的清晰度所吸引,并且更喜欢类似的东西(但如果这是错误的方法,我会非常满意不同的解决方案)。
您是正确的,该模式在运行之前已扩展cp
,因此该命令未知。
您可以通过使用--parents
选项 tocp
而不是 来完成您想要的任务-R
。这只会复制与您的模式匹配的文件,但将使用提供的完整路径名,而不仅仅是尾随文件名。
但是,这个选项不可移植。AFAIK,只有 GNU 版本的 cp 支持它。