gpt4 book ai didi

bash - 通过 xargs realpath 管道时如何过滤不存在​​的文件?

转载 作者:行者123 更新时间:2023-12-04 18:44:18 24 4
gpt4 key购买 nike

我已经养成了使用以下命令在我的编辑器中快速打开相关文件进行代码审查的习惯。

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

但是最近遇到一个问题,第一个或第二个文件可能已被删除,编辑器会产生错误消息,并且无法打开其余文件,迫使我一个一个打开它们。

我可以键入类似的命令来跳过不存在的文件吗?

最佳答案

狭隘地解决问题:使用 Readlink

由于您使用的是 Ubuntu(具有 GNU readlink),您可以使用 readlink -e ,它具有您希望 realpath 的确切行为会提供:

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

由于您在提供 GNU xargs 的 Ubuntu 上,因此由于使用 -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中的一个shell函数中。 .那可能是...
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的好处编辑器的最终调用是它使编辑器的标准输入保持清晰,因此您可以将它用于通过该 channel 与用户通信的编辑器。

关于bash - 通过 xargs realpath 管道时如何过滤不存在​​的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com