Linux 一个Shell脚本,用于在一个步骤中查找并cd到以文件夹名称为参数的文件夹中

Linux 一个Shell脚本,用于在一个步骤中查找并cd到以文件夹名称为参数的文件夹中,linux,bash,shell,terminal,Linux,Bash,Shell,Terminal,我试着用Bash写一行 find ~ -name Music -type d -exec cd '{}' \; 这一个使用find和exec,但我发现错误: 查找:`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

我试着用Bash写一行

find ~ -name Music -type d -exec cd '{}' \;
这一个使用find和exec,但我发现错误:

查找:`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`
有人能帮我指出我的错误吗?我正试着写一行,以后再给它取个别名

注意:该脚本甚至不适用于只包含一个结果和不包含空格的结果的find result


我正在将konsole与bash版本4.2.45(2)一起使用。

您必须在当前shell中运行
cd
在另一个shell中运行它将不起作用,如您所见。创建一个函数。例如:

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

您必须在当前shell中运行
cd
如您所见,在另一个shell中运行它将不起作用。创建一个函数。例如:

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

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

  • -exec
    选项需要一个可执行二进制文件。cd是一个内置的shell,而不是像/bin/bash那样的二进制文件
  • xargs
    还接受可执行二进制文件
  • 代码是正确的。但是,由于您创建了一个.sh文件并执行了它,所以它在
    子shell中执行。因此,它创建了一个子进程(bash),找到了目录,将cd放入该目录,并退出。您当前的shell不受影响
  • 有两个选项可将cd刻录到找到的目录:

    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
    

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

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

  • -exec
    选项需要一个可执行二进制文件。cd是一个内置的shell,而不是像/bin/bash那样的二进制文件
  • xargs
    还接受可执行二进制文件
  • 代码是正确的。但是,由于您创建了一个.sh文件并执行了它,所以它在
    子shell中执行。因此,它创建了一个子进程(bash),找到了目录,将cd放入该目录,并退出。您当前的shell不受影响
  • 有两个选项可将cd刻录到找到的目录:

    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
    

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

    非常感谢,我尝试了一个函数mycd,但它不适用于xargs或exec。请通过使用mycd函数为我提供一行代码来帮助我。非常感谢,我尝试了使用mycd函数,但它不适用于xargs或exec。请帮助我使用mycd功能为我提供一行代码。感谢向我解释所有这些。非常感谢:)感谢向我解释所有这些。非常感谢:)