首页 文章

Shell脚本:需要使用以前的文件夹而不是当前目录

提问于
浏览
2

有这个结构:

/dir1/dir2/dir3/dir4/my_script.sh

在我的脚本中的某一点,需要将dir3的完整路径存储到变量中 . 我知道这有效:

CURRENT=`pwd`

但是,我如何存储前一个?

警告:我搜索过类似的问题,但都包括更改当前目录,这是我想要避免的 .

编辑:我的意思是,因为我正在运行my_script.sh,当前目录是/ dir1 / dir2 / dir3 / dir4/ 我想存储在一个变量中:/ dir1 / dir2 / dir3/

3 回答

  • 1

    如何使用 dirname

    dirname $(pwd)
    /dir1/dir2/dir3
    

    要将一个目录的值存储在变量中:

    x=$(dirname $(pwd))
     echo $x
     /dir1/dir2/dir3
    
  • 2

    您可以使用BASH字符串操作来获取任何完整路径的父父目录路径:

    $> pwd
    /dir1/dir2/dir3/dir4
    $> echo "${PWD%/[^/]*}"
    /dir1/dir2/dir3
    

    %/[^/]*$PWD 删除最后一个匹配的模式 /* ,这是当前的工作目录 .

  • 2

    您可以在本地将任何目录的父目录引用为 .. ,或者如果您可以信任 $PWD 变量,则可以使用 $PWD/.. ,而不是在子shell中执行任何字符串操作或启动命令 .

    当然,这只是让你使用父目录,它不会给你父目录的名称 . 为此,您已经有了几个可用的替代品 . 还有一个,请继续阅读 .

    在bash中 cd 内建命令有两个选项, -P 告诉 cd 使用的物理目录结构遍历,因为它解决符号链接的目录结构,并 -L 哪些手册页这样说:

    the -L option forces symbolic links
          to  be followed by resolving the link after processing instances
          of .. in dir.  If .. appears in dir, it is processed by removing
          the  immediately previous pathname component from dir, back to a
          slash or the beginning of dir.
    

    所以...虽然你可能完全没有以下内容:

    parentdir="$(cd ..; pwd)"
    

    因此,您可以使用以下命令获取父目录:

    parentdir="$(cd -L ..; pwd)"
    

    请注意,虽然这确实涉及目录更改,但更改实际上在子shell( $(...) )内,因此它不会影响您的脚本 .

    请注意,我说"effectively"因为严格来说, $(...)cdpwd 都是内置的bash,所以你实际上并没有产生新的shell .

相关问题