一个Shell脚本,用于查找并cd入一个文件夹名称作为参数的文件夹

时间:2013-06-22 07:52:58

标签: linux bash shell terminal

我尝试用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`

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

注意:脚本甚至不能用于查找结果,只有一个结果,结果没有空格。

我正在使用kashsole和bash版本4.2.45(2)。

2 个答案:

答案 0 :(得分:4)

您必须在当前shell中运行cd正如您所见,在另一个shell中运行它将无效。创建一个功能。例如:

mycd (){
  cd "${1}foo"
}

答案 1 :(得分:2)

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

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

    1.使用subshel​​l更改目录:

    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,没有简单的方法来恢复它们。