我正在运行这个find
命令:
find $HOME * -depth -type d -iname *bowtie* | grep "bowtie*-*1[^2]"
我的预期输出是:
/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
但它返回这个:
/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
如何修改find
命令以仅显示前两个结果?
答案1
您正在find
使用多个相同的搜索路径运行。您正在使用$HOME
以及*
生成的任何名称。显然,它*
扩展到了一些目录,其中包括您正在查找的名称。
建议:
find "$HOME" -type d -name 'bowtie*1.[!2]*'
上述内容还可以通过更有创意地grep
使用测试来消除您的困扰。-name
在调用之前,您需要引用不应相对于当前目录展开的任何模式find
。
该模式匹配以 开头的名称bowtie
,然后包含1.n
,其中n
不是2
。代替[!2]
,您可以使用[13-9]
强制匹配除 之外的整数2
,而不仅仅是除 之外的任何字符2
。
答案2
那是因为您将两个参数传递给find
:
- 您的
$HOME
目录 *
它由 shell 扩展到当前目录中的文件和目录的完整列表,该目录可能是您的$HOME
.
因此,find
将首先搜索$HOME
并返回类似的内容/home/user/foo
,然后它将搜索您提供给它的文件和目录列表,因为它们是由 shell 扩展的,所以它们是路径相对的到您当前的目录,因此没有前导/home/user
,因此它返回类似foo
.