find + cp 稀疏目录树
find + cp sparse directory tree
我有一个目录树,其中包含与某些模式匹配的文件。为了便于讨论,我们假设这些是匹配 *.foo
、或 *.bar
或 baz*
的文件。我想在我的 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
形式的字符串被扩展为单独的单词 fooxxbar
、fooyybar
和 foozzbar
.保留从左到右的顺序。该构造可以嵌套。逗号可能会被引用,以便将它们按字面意思包含在一个单词中。
- Glob Qualifier
(.)
: 用于文件名生成的模式可能以括在括号中的限定符列表结尾。限定符指定将在其他方面与给定模式匹配的文件名插入到
参数列表。 .
仅选择文件。
我有一个目录树,其中包含与某些模式匹配的文件。为了便于讨论,我们假设这些是匹配 *.foo
、或 *.bar
或 baz*
的文件。我想在我的 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
形式的字符串被扩展为单独的单词fooxxbar
、fooyybar
和foozzbar
.保留从左到右的顺序。该构造可以嵌套。逗号可能会被引用,以便将它们按字面意思包含在一个单词中。 - Glob Qualifier
(.)
: 用于文件名生成的模式可能以括在括号中的限定符列表结尾。限定符指定将在其他方面与给定模式匹配的文件名插入到 参数列表。.
仅选择文件。