Как установить значение при выполнении команды find?

Использованиеjq:

jq -r '.[]' file

Использованиеegrep:

egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' file

или

egrep -o '([0-9]+\.){3}[0-9]+' file

Использованиеgrep:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' file
2
28.07.2020, 11:02
3 ответа

Используйте только один -execвместе с sh -c:

.
find. -exec sh -c '
    NOW=$(date +%s);
    echo "$NOW $1 First Output";
    sleep 3;
    echo "$NOW $1 Second Output";
' find-sh {} \; 

В качестве альтернативы, если вы по какой-либо причине хотите придерживаться цепочек -execs, вы можете использовать временный файл, но тогда вам нужно sh -cвсякий раз, когда вы читаете этот временный файл:

find. \
  -exec sh -c 'date +%s > /tmp/now' \; \
  -exec sh -c 'echo "$(cat /tmp/now) $1 First Output"' find-sh {} \; \
  -exec sleep 3 \; \
  -exec sh -c 'echo "$(cat /tmp/now) $1 Second Output"' find-sh {} \;

Следующий -execне будет работать, потому что оболочка будет оценивать часть $(..)перед запуском find:

-exec echo "$(cat /tmp/now) {} First Output" \;

ПС:

Вы можете спросить, откуда это find-shиз -exec sh -c '...' find-sh {}. Вот ответ .

4
18.03.2021, 23:16

Установить NOWдля каждого файла заново, т.е. внутри петли for:

find. -exec sh -c '
   for f do
      NOW=$(date +%s)
      echo "$NOW  $f First Output"
      sleep 3
      echo "$NOW $f Second Output"
   done
' find-sh {} +
3
18.03.2021, 23:16

Мне не совсем понятно, что вы хотите сделать, но если вам нужно значение $NOW, которое обновляется до текущего времени эпохи в момент обработки каждого файла, вы можете использовать zshи его $EPOCHSECONDSпеременная (или $EPOCHREALTIME, если вам нужны также наносекунды )в модуле zsh/datetime(или ${(%):-%D{%s}}без zsh/datetime, хотя это менее разборчиво):

find. -exec zsh -c '
  zmodload zsh/datetime
  typeset -F SECONDS # make it float
  for file do
    start_time=$EPOCHSECONDS SECONDS=0
    print -r $start_time processing $file

    processing $file

    end_time=$EPOCHSECONDS duration=$SECONDS
    print start=$start_time end=$end_time duration=$SECONDS
  done' zsh {} +

Или поскольку zshможет выполнять работу findс его рекурсивными глобусами:

#! /bin/zsh -

zmodload zsh/datetime
typeset -F SECONDS # make it float.

for file (./**/*(ND)) {
  start_time=$EPOCHSECONDS SECONDS=0
  print -r $start_time processing $file

  processing $file

  end_time=$EPOCHSECONDS duration=$SECONDS
  print start=$start_time end=$end_time duration=$SECONDS
}

В оболочке bashвы можете получить эквивалент start_time=$EPOCHSECONDSс помощью printf -v start_time '%(%s)T'.

0
18.03.2021, 23:16

Теги

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