1

我尝试在 Bash 中写一个单行,

find ~ -name Music -type d -exec cd '{}' \;

这个使用 find 和 exec 但我收到错误:

find: `cd': 没有这样的文件或目录

第二次尝试使用 XARGS,

find ~ -name Music  -type d -print0 | xargs -0 cd  

现在我再次尝试编写脚本 .sh

pathe=$(find ~ -name $1 -type d | head -n 1 )
cd $pathe

并试图执行脚本./1.sh Music,但它没有工作。

到目前为止唯一有效的方法是直接在终端中输入以下命令

cd `find ~ -iname books -type d | head -n 1`

任何人都可以通过指出我的错误来帮助我吗?我正在尝试编写一个单行并稍后对其进行别名。

注意:该脚本甚至不适用于只有一个结果和没有空格的结果的查找结果。

我正在使用带有 bash 版本 4.2.45(2) 的 konsole。

4

2 回答 2

4

您必须cd在当前的 shell 中运行。如您所见,在另一个 shell 中运行它是行不通的。创建一个函数。例子:

mycd (){
  cd "${1}foo"
}
于 2013-06-22T07:55:21.597 回答
2

前 3 个实现存在一些问题:

  1. -exec选项需要一个可执行的二进制文件。cd 是内置的 shell,而不是二进制文件,例如 /bin/bash
  2. xargs也需要可执行的二进制文件。
  3. 代码是正确的。但是,由于您创建了一个 .sh 文件并执行了它,因此它在一个 .sh 文件中执行subshell。因此,它创建了一个子进程(bash),找到了目录,cd 到该目录,然后退出。您当前的外壳不受影响。

cd 到找到的目录有 2 个选项:

1.使用子shell改变目录:

find ~ -name Music -type d -exec bash -c "cd '{}'; exec bash" \;

这将启动一个 bash shell,在该 shell 中,它会更改为您想要的目录。
注意,您所做的任何更改都不会反映在父 shell 中。

2.使用bash函数:

findAndCd(){
    pathe=$(find ~ -name $1 -type d | head -n 1 )
    cd $pathe
}

Usage:
findAndCd Music

代替cd,您可以选择使用pushd代替。就个人而言,除了 cd 修改我的 CWD 和 OLDCWD 之外,我不喜欢其他命令,没有简单的方法来恢复它们。

于 2013-06-22T11:42:20.950 回答