Как я могу отфильтровать несуществующие файлы при передаче через xargs realpath? - PullRequest
0 голосов
/ 04 марта 2020

Я привык использовать следующую команду для быстрого открытия соответствующих файлов в моем редакторе для проверки кода.

git diff --name-only master... | xargs realpath | someEditor

Но недавно возникла проблема, когда первый или второй файл мог быть удален, и редактор выдаст сообщение об ошибке и не откроет остальные файлы, вынуждая меня открывать их один за другим.

Есть ли подобная команда, которую я могу набрать, которая пропустит несуществующие файлы?

1 Ответ

0 голосов
/ 04 марта 2020

Узкое решение проблемы: с Readlink

Поскольку вы работаете в Ubuntu (с GNU readlink), вы можете использовать readlink -e, который ведет себя точно так же, как в надежде что realpath предоставит:

git diff --name-only master... \
  | xargs -d $'\n' readlink -e -- \
  | xargs -d $'\n' someEditor

Поскольку вы работаете в Ubuntu, которая предоставляет GNU xargs, этот код будет правильно обрабатывать имена файлов с пробелами, буквенными кавычками или буквенными обратными слешами из-за использования -d $'\n' на обоих xargs вызовах.


Узкое решение проблемы: с Realpath

Если мы хотим придерживаться ваших существующих инструментов (то есть, realpath вместо readlink) и просто добавьте тест на существование, который может выглядеть следующим образом:

git diff --name-only master... \
  | xargs -d $'\n' sh -c 'for f; do [ -e "$f" ] && realpath "$f"; done' _ \
  | xargs -d $'\n' someEditor

Совет по реализации

Кстати, рассмотрите возможность инкапсуляции желаемой реализации в функцию оболочки в вашем ~/.bashrc. Это может быть что-то вроде ...

forEachChangedFile {
  local -a files
  readarray -t files < <(
    git diff --name-only "${branchExpr:-master...}" \
      | xargs -d $'\n' readlink -e --
  )
  if (( $# )); then
    "$@" "${files[@]}"
  else
    "${EDITOR:-someEditor}" "${files[@]}"
  fi
}

... позже используется как:

forEachChangedClient vim

или

branchExpr=someBranch..someOtherBranch forEachChangedFile emacs-client

Преимущество не использования xargs последний вызов редактора заключается в том, что он оставляет стандартный текст редактора, так что вы можете использовать его для редакторов, которые общаются с пользователем по этому каналу.

...