find + xargs + ctags 以某种方式缺少整个子目录的标签

find + xargs + ctags is somehow missing tags for entire subdirectories

(我正在使用 RHEL7)。

对于 Vim 我创建了一个 tags 文件 findctags,运行 它来自包含我的许多目录的目录 Python 打包源代码。

最初我是这样做的:

find . -name \*.py | xargs ctags

但在某些时候我发现它丢失了一些完整的包。

奇怪的是,当我决定跳过所有测试目录时它得到了修复:

find . -name \*.py -not \( -path \*/tests\*/\* \) | xargs ctags

我最近又添加了一些 Python 包,现在这个修复程序又跳过了一些目录。

顺便说一句,这个有效:

find . -name \*.py > files_for_ctags.txt; ctags -L files_for_ctags.txt

所以现在这将是我的解决方案。

但如果能理解为什么 xargs 版本有时会跳过整个标签目录,那就更好了。

有什么建议吗?

find 可能会通过管道向 xargs 发送太多行。 您可以用 find . -name \*.py | wc -l.

确认

在这种情况下,xargs 启动 ctags 进程超过两次。 第 n 个启动的 ctags 进程可能会覆盖第 (n-1) 个启动的 ctags 进程生成的标签文件。这可能是你观察到的跳过技巧

正如我在评论中所写,您可以使用 find . -name \*.py | ctags -L - 来避免跳过。

关于“-L -”存在一个已知问题。 如果find发送一个以“--”开头的文件名给ctags,就麻烦了; ctags 将其识别为一个选项。 参见 https://github.com/universal-ctags/ctags/issues/1883