查找返回相同路径两次,但被截断

jus*_*482 3 grep find regular-expression

我正在运行这个find命令:

find $HOME * -depth -type d -iname *bowtie* | grep "bowtie*-*1[^2]"
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
Run Code Online (Sandbox Code Playgroud)

但它返回这个:

/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
Documents/scripts/bowtie1.3.0-linux-x86_64
Documents/scripts/bowtie-1.3.0-linux-x86_64
Run Code Online (Sandbox Code Playgroud)

如何修改find命令以仅显示前两个结果?

Kus*_*nda 14

您正在find使用多个相同的搜索路径运行。您正在使用$HOME以及生成的任何名称*。显然,它*扩展到了一些目录,其中包括您正在查找的名称。

建议:

find "$HOME" -type d -name 'bowtie*1.[!2]*'
Run Code Online (Sandbox Code Playgroud)

上述内容还可以grep通过更有创意地使用-name测试来消除您的困扰。在调用之前,您需要引用不应相对于当前目录展开的任何模式find。

该模式匹配以 开头的名称bowtie,然后包含1.n,其中n不是2。代替[!2],您可以使用[13-9]强制匹配除 之外的整数2,而不仅仅是除 之外的任何字符2。

  • 请注意,尽管这可能不是OP想要的`grep "bowtie*-*1[^2]"`匹配包含`bowti`后跟0个或多个`e`后跟0个或多个`-`的行后跟“1”和“2”以外的任何字符。因此,它会匹配文件路径的第二行,例如“$”/home/user/foo\nbowti1/whatever/\nBOWTIE-12'`。所以你的脚本所做的事情是完全不同的,但很可能是OP所需要的。 (2认同)

ter*_*don 9

那是因为您将两个参数传递给find:

  • 您的$HOME目录
  • *它由 shell 扩展到当前目录中的文件和目录的完整列表,该目录可能是您的$HOME.

因此find,将首先搜索$HOME并返回类似的内容/home/user/foo,然后它将搜索您提供给它的文件和目录列表,因为它们是由 shell 扩展的,所以是相对于当前目录的路径,因此没有前导/home/user, 和所以它返回类似foo.