Начиная с ответа @Joseph R., это мое решение, чтобы заставить его работать с find, так как я не мог заставить его команду работать. (Я не думаю, что это так из-за правил, применимых к \+: после {}элемента ничего не может быть .) (Я не мог комментировать. Весь этот абзац может быть фактически удален.)
Чтобы скопировать все файлы в один и тот же каталог (здесь target/directory):
find directory/to/copy -type f -exec install -Dm 755 "{}" "target/directory" \;
-D здесь не является обязательным, он просто создаст несуществующие каталоги для цели.
Чтобы скопировать всю иерархию каталогов и ее файлы (при этом пустые каталоги будут опущены), начиная с того места, где вы сейчас находитесь:
find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;
Как сказано, это воссоздает дерево, начиная с $PWD. Кроме того, если вам нужно скопировать пустой каталог, вы можете найти способ с помощью -type dof findи install -d.
Итак, для того, чтобы скопировать дерево, начиная с каталога, который не является $PWD:
(cd parent/directory && find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;)
Обратите внимание, как parent/directoryне копируется.
дополнительный
Для тех shell/fish, кто использует , вот строка, которая делает то же самое:
fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'