cd /src/path &&
find . -type d ! -name . -prune \
\( -exec test -e /tgt/path/{} \; \
\( -ok echo cp -rt /tgt/path {} \; \
-o -exec printf 'not copied:\t%s\n' {} \; \
\) \) -o ! -name . -exec echo cp -rt /tgt/path {} +
примитив find
-ok
работает как -exec
, за исключением того, что сначала он запрашивает свой stderr с описанием команды, которую он собирается запустить, и ожидает положительного или отрицательного ответа (например, y
или n
) , за которым следует входить. Вышеупомянутый сценарий find
запросит подтверждение, если каталог в / src / path
также существует в / tgt / path
перед его копированием, но все найденные файлы в / src / path
копируются без запроса.
(вам придется удалить echo
s, чтобы заставить его делать что-то большее, чем делать вид, что работает)
Другой сценарий find
, который сначала вызывает оболочку -уровневые каталоги ниже / src / path
могут выглядеть так:
cd /src/path &&
find . ! -name . -prune -exec sh -c '
[ -t 0 ] &&
trap "stty $(stty -g;stty -icanon)
trap - 0 1 2; exit" 0 1 2
for f
do [ -e "$0/$f" ] &&
case $(printf "%b:\n%s\n" >&2 \
\\nsource "$(ls -ld -- "$PWD/$f")" \
\\ntarget "$(ls -ld -- "$0/$f")" \
"copy source over target?(\"y\"es|a\"no\"ther key): \c"
dd count=1 2>/dev/null
echo >&2) in ([yY]) ! :
esac|| set -- "$@" "$f"; shift
done; cp -r "$@" "$0"
' /tgt/path {} +