Find 查找+;xargs+;ctags不知何故丢失了整个子目录的标记

Find 查找+;xargs+;ctags不知何故丢失了整个子目录的标记,find,xargs,ctags,Find,Xargs,Ctags,(我正在使用RHEL7) 对于Vim,我创建了一个带有find和ctags的tags文件,从包含Python包源代码的许多目录的目录中运行它 最初我是这样做的: find . -name \*.py | xargs ctags 但在某个时候,我发现它丢失了一些完整的包 奇怪的是,当我决定跳过所有测试目录时,它得到了修复: find . -name \*.py -not \( -path \*/tests\*/\* \) | xargs ctags 我最近又添加了一些Python包,现在这个补

(我正在使用RHEL7)

对于Vim,我创建了一个带有
find
ctags
tags
文件,从包含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进行确认-名称\*.py | wc-l

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

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

关于“-L-”有一个已知的问题。 如果find向ctags发送一个以“-”开头的文件名,这可能是一个麻烦;ctags将其视为一种选择。
请参阅。

给出丢失包路径的示例。如果您尝试
查找,会发生什么-name\*.py-print0 | xargs-0 ctags
?我给了你的
-print0
建议,尝试一下@jhnc,但没有解决问题。这是您的问题:所有目录都有类似的名称格式和目录树形状(毕竟它们都是Python包)。对于我来说,没有明显的理由不包括其中一些。例如,我刚才看到丢失的路径甚至不是按字母顺序排列的第一个或最后一个路径(可能是发生了一些剪切或覆盖,但似乎不是)。同样地,导入ctags.txt的
文件的版本可以工作,所以我不知道为什么
xargs
版本不能工作-name\*.py | ctags-L-
是的,这很有效!我通过运行
rm标签检查了多个
ctag
的假设;找到-name\*.py | xargs ctags--append
,我确实看到了我期望的所有标记。如果没有
--append
,很多标签都会丢失(我现在认为这是因为
xargs
导致了
ctags
的多次启动,因此我实际上只看到了最终
ctags
的结果)。非常感谢:-)