Pipe Fail (141) при передаче вывода в tee - почему?

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 {} +
5
04.04.2016, 06:55
0 ответов

Теги

Похожие вопросы