如果我有一个文件路径,例如…

/home/smith/Desktop/Test
/home/smith/Desktop/Test/

我如何改变字符串,使它将是父目录?

e.g.

/home/smith/Desktop
/home/smith/Desktop/

当前回答

如果/home/smith/Desktop/Test/../是你想要的:

dirname 'path/to/child/dir'

如图所示。

其他回答

如果/home/smith/Desktop/Test/../是你想要的:

dirname 'path/to/child/dir'

如图所示。

dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"

如果后面有斜杠,也可以。

这个会被放到父文件夹中

cd ../

从Charles Duffy - Dec 17 '14 at 5:32关于主题的想法/评论开始,在Bash脚本中获取当前目录名(没有完整路径)

#!/bin/bash
#INFO : https://stackoverflow.com/questions/1371261/get-current-directory-name-without-full-path-in-a-bash-script
# comment : by Charles Duffy - Dec 17 '14 at 5:32
# at the beginning :



declare -a dirName[]

function getDirNames(){
dirNr="$(  IFS=/ read -r -a dirs <<<"${dirTree}"; printf '%s\n' "$((${#dirs[@]} - 1))"  )"

for(( cnt=0 ; cnt < ${dirNr} ; cnt++))
  do
      dirName[$cnt]="$( IFS=/ read -r -a dirs <<<"$PWD"; printf '%s\n' "${dirs[${#dirs[@]} - $(( $cnt+1))]}"  )"
      #information – feedback
      echo "$cnt :  ${dirName[$cnt]}"
  done
}

dirTree=$PWD;
getDirNames;

显然,父目录是通过简单地附加点。点文件名来给出的:

/home/smith/Desktop/Test/..     # unresolved path

但你必须要解析路径(没有任何点-点路径组件的绝对路径):

/home/smith/Desktop             # resolved path

使用dirname的顶部答案的问题是,当你输入一个带有点号的路径时,它们不起作用:

$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/..   # not fully resolved

这个更强大:

dir=/home/smith/Desktop/Test
parentdir=$(builtin cd $dir; pwd)

你可以在/home/smith/Desktop/Test/..,但也有更复杂的路径,比如:

$ dir=~/Library/../Desktop/../..
$ parentdir=$(builtin cd $dir; pwd)
$ echo $parentdir
/Users                                  # the fully resolved path!
 

注意:使用内置确保不会调用用户定义的cd函数变体,而是调用没有输出的默认实用程序形式。