为什么在更改目录时通配符 * 不起作用?

Job*_*r69 7 cd-command wildcards

例如我在我的目录中:

/home/myname
Run Code Online (Sandbox Code Playgroud)

然后我想 CD 到一个不同的目录。

/home/pulsar/... 
Run Code Online (Sandbox Code Playgroud)

由于我需要深入到另一个目录中,如何在不必键入整行的情况下执行此操作?我试过

cd */thedirectoryiwanttogointo
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我必须输入整行。

Tho*_*key 6

您的通配符可能不起作用,因为:

  • 您提供的位置中没有与通配符匹配的内容,或者
  • 不止一场比赛。

在子目录之间频繁移动的常用方法(在 shell 中)是使用该CDPATH功能以及pushdpopd

CDPATH功能(可能首先出现在 tcsh 中)是一个以冒号分隔的目录列表。如果您名字的父代thedirectoryiwanttogointo相当唯一,那么您可以将父代添加到列表中。

为了进一步阅读(你的 shell 的手册页应该放在第一位):

pushdpopd更新CDPATH,但仍可以追溯到 20 世纪 90 年代中期。它们允许您在各自的命令期间保存当前目录(“推入”堆栈)并恢复它(从堆栈“弹出”)cd。进一步阅读:

其他人使用 shell 别名或符号链接。这些在前往知名地点时最有用。


jll*_*gre 5

假设所有可能的目标目录都在下面/home,并且目录名称中没有换行符,您可以使用以下 shell 函数:

cds() {
    cd "$(find /home -type d -name "$1" | head -n 1)"
}

$ cds thedirectoryiwanttogointo
Run Code Online (Sandbox Code Playgroud)

当然,根据子目录和文件的数量/home以及操作系统是否能够在内存中缓存所有树的能力,性能会有很大差异。

在 GNU 系统上,您可以使用以下语法来加快速度并使其对于文件名中的换行符更可靠:

cds() {
    cd "$(find /home -type d -name "$1" -print -quit)"
}
Run Code Online (Sandbox Code Playgroud)

一旦找到第一个匹配项,就会停止搜索。

请注意,参数被视为一种模式,因此您可以执行以下操作:

cds 'foo*bar'
Run Code Online (Sandbox Code Playgroud)

例如cd进入第一个目录(未指定顺序),其名称以 . 开头foo并以 . 结尾bar