获取文件的父目录


24

我只想获取文件的父目录的名称。

示例:当我有时path=/a/b/c/d/file,我只希望d而不是/a/b/c/d(从中得到dirname $path)作为输出。

有什么复杂的方法可以做到这一点吗?

Answers:


26

这听起来像你想的基本部分的目录名称:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

我为什么收到。而不是Debian上的父目录?
阿米尔2015年

@Amir:您是从完整路径还是仅从文件名开始?如果只是文件名,该dirname命令将假定它位于当前目录(也称为“。”)中。
戈登·戴维森

好吧,我正在使用:parentname="$(basename "$(dirname "$pwd")")"
Amir

1
@Amir:Shell变量区分大小写,PWD必须大写。尝试parentname="$(basename "$(dirname "$PWD")")"
戈登·戴维森

5

您可以使用pwd获取当前的工作目录,并使用参数扩展来避免将其分叉到另一个(子)shell中。

echo ${PWD##*/}

编辑:可靠的来源


这个问题与当前目录无关。您可以使用${path##*/}
Matteo,

2

我认为这是一种资源较少的解决方案:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

编辑:对不起,嵌套扩展在bash中是不可能的,但是在zsh中有效。Bash版本:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d

在某些情况下,这不能很好地处理,主要是在没有完整的多级路径时。例如,尝试使用filepath=file或filepath = / file`。
Gordon Davisson

确实。但是,父目录是foofile什么?如果不是完整路径,则无法知道(也许foofile是一个现有文件,而不仅仅是一个“字符串”)。
uzsolt

1

在bash中,一行:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
您能详细说明所涉及的程序吗?它可以为将来的读者提供帮助。另外,请尽量不要写1/2行答案。
洛伦佐·冯·马特洪峰

0

我最喜欢Julian67的答案,但是这里有一个扩展版本:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.