find + cp 稀疏目录树

find + cp sparse directory tree

我有一个目录树,其中包含与某些模式匹配的文件。为了便于讨论,我们假设这些是匹配 *.foo、或 *.barbaz* 的文件。我想在我的 zsh 脚本中备份 只有文件 将这些模式匹配到新目录。

看似显而易见的解决方案,

find fromdir \( -name '*.{foo,bar}' -o -name 'baz*' \) -exec cp {} todir \;

不起作用,因为 fromdir/x/y/a.foo 的目标目录不存在。

我正在考虑使用 rsync,但我只知道如何排除 某些文件被复制,不知道如何限制 复制.

我可以通过编写一个小的辅助脚本来解决问题,mdcp1file,像这样:

#!/bin/zsh
set -u
mkdir -p /:h # Create destination directory if needed
cp  

并在我的 find 命令中使用它而不是 cp。我想知道是否有更简单的方法来解决这个问题,要么加强我的 find-exec,要么巧妙地使用 rsync

正如您提到的,您使用 zsh,您可以这样做:

cd /path/to/source/dir
cp --parents **/{*.{foo,bar},baz*}(.) /path/to/destination/dir

这里我们利用:

  • cp --parents: Bash: Copy named files recursively, preserving folder structure
  • **: 用于匹配多个目录
  • 大括号扩展: foo{xx,yy,zz}bar 形式的字符串被扩展为单独的单词 fooxxbarfooyybarfoozzbar.保留从左到右的顺序。该构造可以嵌套。逗号可能会被引用,以便将它们按字面意思包含在一个单词中。
  • Glob Qualifier (.): 用于文件名生成的模式可能以括在括号中的限定符列表结尾。限定符指定将在其他方面与给定模式匹配的文件名插入到 参数列表。 . 仅选择文件。