Выполнить команду до того, как произойдет rsync --delete-after

Сначала вы можете использовать более быструю команду, чтобы найти правильный номер. Мои тесты показывают, что find. -maxdepth 1 -type f -not -name '.*' | wc -lбыстрее, чемls -l | grep '^-' | wc -l(примерно на 4 :3 ). Если вам также нужны скрытые файлы, вы должны использовать ls -aили пропустить часть -not -name '.*'с помощью find.

Далее вам не нужно считать файлы дважды, а вместо этого сохранить результат в переменной и использовать его повторно:

$(count=$(find. -maxdepth 1 -type f -not -name '.*' | wc -l)
  if [[ "$count" -eq 1 ]]; then
    echo "1 file"
  else
    echo "$count files"
  fi)

Как видите, вы должны использовать одну подоболочку, иначе переменная не будет доступна для второй команды. Я также использовал специфичный для bash [[... ]]вместо [... ]здесь. В целом это лучшее решение.

Наконец, вы также можете использовать переменную Bash $PROMPT_COMMANDдля выполнения некоторого кода непосредственно перед выводом приглашения $PS1. Таким образом, вам не нужно хранить весь код в переменной $PS1. Однако переменная $countбудет глобальной . Это может выглядеть так:

function count_files () {
  __count=$(find. -maxdepth 1 -type f -not -name '.*' | wc -l)
  if [[ "$__count" -eq 1 ]]; then
    __plural=
  else
    __plural=s
  fi
}
PROMPT_COMMAND=count_files
PS1='other stuff $__count file$__plural more stuff'

Не знаю, какой из этих шагов вы бы посчитали упрощением:)

РЕДАКТИРОВАТЬ

Я только что нашел эту ветку SO . Его можно использовать для подсчета таких файлов

function count_files () {
  local name
  __count=0
  for name in *; do
    [[ -f "$name" ]] && ((__count++))
  done
  # like above...
}

Скорость составляет около 1 :13 по сравнению с версией find. Это мужественно, потому что он запускает меньше процессов (по той же причине, что версия find быстрее, чем версия ls ). У протектора есть и другие решения с extglob. Все зависит от вопроса, нужны ли вам файлы или также ссылки на файлы или еще что-то. Опять же, код стал быстрее, но теперь выглядит более сложным, так к какому «простому» вы стремитесь?

РЕДАКТИРОВАТЬ 2

Обратите внимание, хотя в комментариях я сказал, что накладные расходы на запуск процесса могут быть лишь небольшими по сравнению с накладными расходами на сортировку, когда вам нужно сортировать множество файлов, для меня это начинает показывать, если я запускаю код в /usr/bin/, содержащий около 2500 файлов.

1
30.11.2019, 05:40
1 ответ

Нет возможности сделать это с помощью одного вызова rsync, но вы можете имитировать это поведение, запустив rsyncбез--delete(или --delete-after), затем выполните свою команду и запустите ту же команду rsyncв этот раз. время с опцией --deleteпотом.

Пример:

rsync -avh src/ dest && command && rsync -avh --delete src/ dest
1
27.01.2020, 23:40

Теги

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