XYZ *という名前のすべてのファイルを1つのフォルダーにコピーしたい。問題は、ファイルが異なるサブフォルダーにあり、フォルダー構造の深さもすべてのファイルで同じではないことです。幸い、少なくとも各ファイルには一意の名前が付いています。
もちろん、cpコマンドについて考えましたが、これが機能するには、フォルダー構造の深さが同じである必要があると思います。
Bashを使用して(find ... -exec cp ...
を使用する場合のように)多くの個別のプロセスを開始することを避けたい場合(および**形式に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
これには find を使用できます:
$ find path/to/src -type f -name XYZ\* -exec cp -p {} path/todest/ \;
Bashの代わりにzshを使用する場合は、**ファイルのglobパターンを使用できます。これは、すべてのサブフォルダーに再帰的に一致します。
cp path/to/src/**/XYZ* path/to/dest