YTK*_*mba 183 directory bash dirname
如果我有一个文件路径,如...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
Run Code Online (Sandbox Code Playgroud)
如何更改字符串以使其成为父目录?
例如
/home/smith/Desktop
/home/smith/Desktop/
Run Code Online (Sandbox Code Playgroud)
Mic*_*man 285
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
Run Code Online (Sandbox Code Playgroud)
如果有斜杠也可以工作.
And*_*ler 17
......但是"在这里看到的"被打破了.这是修复:
> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
Run Code Online (Sandbox Code Playgroud)
aih*_*iho 12
如果您只需要父目录的名称:
parent_dir_name=$(basename $(dirname $PWD))
Run Code Online (Sandbox Code Playgroud)
Ria*_*zvi 11
显然,通过简单地附加点 - 点文件名来给出父目录:
/home/smith/Desktop/Test/.. # unresolved path
Run Code Online (Sandbox Code Playgroud)
但您必须要求已解析的路径(没有任何点 - 点路径组件的绝对路径):
/home/smith/Desktop # resolved path
Run Code Online (Sandbox Code Playgroud)
使用的最佳答案的问题dirname
是,当您输入带点点的路径时它们不起作用:
$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/.. # not fully resolved
Run Code Online (Sandbox Code Playgroud)
这更强大:
dir=/home/smith/Desktop/Test
parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
Run Code Online (Sandbox Code Playgroud)
您可以提供它/home/smith/Desktop/Test/..
,但也可以提供更复杂的路径,例如:
$ dir=~/Library/../Desktop/../..
$ parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
$ echo $parentdir
/Users # the fully resolved path!
Run Code Online (Sandbox Code Playgroud)
Sté*_*hon 11
我喜欢非常简短、清晰、有保证的代码。如果它不运行外部程序,那么加分点是,因为您需要处理大量条目的那一天,它会明显更快。
不确定您拥有和想要的保证,因此无论如何都要提供。
如果你有保证,你可以用很短的代码来做到这一点。这个想法是使用 bash 文本替换功能来剪切最后一个斜杠和后面的任何内容。
从原始问题的简单到更复杂的情况下回答。
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
Run Code Online (Sandbox Code Playgroud)
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
Run Code Online (Sandbox Code Playgroud)
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/
do
P_ENDNOSLASH="${P%/}" ; echo "${P_ENDNOSLASH%/*}"
done
/home/smith/Desktop
/home/smith/Desktop
Run Code Online (Sandbox Code Playgroud)
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/ \
/home/smith///Desktop////Test//
do
P_NODUPSLASH="${P//\/*(\/)/\/}"
P_ENDNOSLASH="${P_NODUPSLASH%%/}"
echo "${P_ENDNOSLASH%/*}";
done
/home/smith/Desktop
/home/smith/Desktop
/home/smith/Desktop
Run Code Online (Sandbox Code Playgroud)
如果/home/smith/Desktop/Test/../
你想要的话:
dirname 'path/to/child/dir'
Run Code Online (Sandbox Code Playgroud)
如看到这里.