我只想获取文件的父目录的名称。
例如:当我有 时path=/a/b/c/d/file
,我只想要d
而不是/a/b/c/d
(我从 获得dirname $path
)作为输出。
有什么复杂的方法可以做到这一点吗?
答案1
听起来你想要的是基本名称的目录名:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
答案2
答案3
我认为这是一个较少资源的解决方案:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
编辑:抱歉,嵌套扩展在 bash 中无法实现,但在 zsh 中可以实现。Bash 版本:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
答案4
dirname
并且basename
应该用于这项任务。
简短的回答是
dirname /a/b/c/d/file | xargs basename
=> d
第一步,获取dirname
路径,产生父文件夹的路径,如下所示。
dirname /a/b/c/d/file
=> /a/b/c/d
然后使用 将父文件夹的路径通过管道传输到另一个命令|
。由于basename
(和dirname
)不在流上运行,而是仅在参数化输入上运行,因此您无法使用 将结果直接通过管道传输到basename
。| basename
但是,这已由 修复xargs
,它将管道中的流转换为basename
这使得最终的解决方案成为
dirname /a/b/c/d/file | xargs basename
也可以写成……
echo '/a/b/c/d/file' | xargs dirname | xargs basename