Начиная с ответа @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 d
of 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/{}" \\;'