如果我有一个文件路径,例如…
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
我如何改变字符串,使它将是父目录?
e.g.
/home/smith/Desktop
/home/smith/Desktop/
如果我有一个文件路径,例如…
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
我如何改变字符串,使它将是父目录?
e.g.
/home/smith/Desktop
/home/smith/Desktop/
当前回答
另一个答案的动机
我喜欢非常简短、清晰、有保证的代码。如果它不运行外部程序,它的好处是,因为有一天你需要处理大量的输入,它会明显更快。
原则
不确定你有什么保证,想要什么,所以还是提供吧。
如果你有保证,你可以用很短的代码完成它。其思想是使用bash文本替换特性来删除最后一个斜杠和后面的任何内容。
回答从简单到较复杂情况下的原题。
如果路径保证结尾没有任何斜杠(in和out)
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
如果path保证以一个斜杠结尾(in和out)
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
如果输入路径可能以零或一个斜杠(而不是多个)结束,而您希望输出路径以不带斜杠结束
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
如果输入路径可能有许多多余的斜杠,而您希望输出路径结束时不带斜杠
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
其他回答
根据你是否需要绝对路径,你可能需要额外的步骤:
child='/home/smith/Desktop/Test/'
parent=$(dirname "$child")
abs_parent=$(realpath "$parent")
...但“这里看到的”是坏的。下面是解决方案:
> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
如果后面有斜杠,也可以。
使用这个:export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")")")")"如果你想要第四个父目录
出口myvar# = " $(目录名“$(目录名(目录名$ PWD)美元)”)” 如果你想要第三个父目录
输出MYVAR="$(dirname $PWD)")" 如果你想要第二个父目录
另一个答案的动机
我喜欢非常简短、清晰、有保证的代码。如果它不运行外部程序,它的好处是,因为有一天你需要处理大量的输入,它会明显更快。
原则
不确定你有什么保证,想要什么,所以还是提供吧。
如果你有保证,你可以用很短的代码完成它。其思想是使用bash文本替换特性来删除最后一个斜杠和后面的任何内容。
回答从简单到较复杂情况下的原题。
如果路径保证结尾没有任何斜杠(in和out)
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
如果path保证以一个斜杠结尾(in和out)
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
如果输入路径可能以零或一个斜杠(而不是多个)结束,而您希望输出路径以不带斜杠结束
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
如果输入路径可能有许多多余的斜杠,而您希望输出路径结束时不带斜杠
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