我想将所有名为 XYZ* 的文件复制到一个文件夹中。问题是这些文件位于不同的子文件夹中,而且所有文件的文件夹结构的深度都不相同。幸运的是,至少每个文件都有一个唯一的名称。
当然,我考虑过 cp 命令,但我猜想文件夹结构的深度需要相同才能使其工作。
答案1
如果您想避免find ... -exec cp ...
使用 bash(并且没有 zsh 的 ** 形式)启动许多单独的进程(因为使用可能会这样做),您可以按如下方式执行单个 cp:
cp -p $(find path/to/src -name 'XYZ*') path/to/dest
$(...) 形式是反引号进程替换的 posix 版本。以下是示例。
find . -name 'd*a'
cp -p $(find . -name 'd*a') ../zeta
ls ../zeta
这些命令产生以下输出:
./.?/dx2a
./.?/dx4a
./.tdot1/dx1a
./.tdot2/dx2a
cp: will not overwrite just-created `../zeta/dx2a' with `./.tdot2/dx2a'
dx1a dx2a dx4a
答案2
您可以使用寻找为了这:
$ find path/to/src -type f -name XYZ\* -exec cp -p {} path/todest/ \;
答案3
如果你使用 zsh 而不是 bash,那么你可以使用 ** 文件 glob 模式来实现。这将递归匹配所有子文件夹。
cp path/to/src/**/XYZ* path/to/dest