从文件路径获取文件目录路径


400

在Bash中,VAR="/home/me/mydir/file.c"如何获得"/home/me/mydir"

Answers:


646

dirname以及basename您正在寻找的提取路径分量的工具:

$ VAR=/home/me/mydir/file.c

$ DIR=$(dirname "${VAR}")

$ echo "${DIR}"
/home/me/mydir

$ basename "${VAR}"
file.c

他们不是内部的Bash命令,但他们是POSIX标准的一部分(见dirnamebasename)等应可在绝大多数将要运行bash的系统。


4
为什么在变量名的周围使用方括号,而不是例如“ $ VAR”?
user658182


1
@ user658182在此特定示例中,这是出于习惯而不是必要的。
被遗弃的购物车,

95
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir

$ echo "${VAR##*/}"
file.c

为了避免对basename和的依赖dirname


3
由于两者都是POSIX的一部分,因此依赖性不是问题。
orkoden

1
orkoden,你是对的。我的回答的目的是表明没有义务执行另外两个过程。bash对于用例来说是足够的。
伊曼纽尔·德沃

2
我使用Emmanuel的方法是因为我希望传递文件名或文件夹名,然后计算文件夹路径。使用此正则表达式可正确执行操作,而当我输入文件夹时,dirname函数将返回父文件夹。
AnneTheAgile 2013年

8
但是,如果$ VAR中没有路径信息,则$ {VAR%/ *} / test会生成等于$ VAR / test的意外值,而$(dirname $ VAR)会生成./test的更可预测且更适当的值。这很重要,因为前者将尝试将文件名视为目录,而后者将可以。
davemyron

19

值得一提的是,如果只有文件名或相对路径,那么单独使用dirname将无济于事。对我而言,答案最终是readlink

fname='txtfile'    
echo $(dirname "$fname")                # output: .
echo $(readlink -f "$fname")            # output: /home/me/work/txtfile

然后,您可以将两者结合起来以获得目录。

echo $(dirname $(readlink -f "$fname")) # output: /home/me/work

1
如果不存在多个路径组件,则应使用readlink -m "$fname"递归规范化给定名称
EDkan,2016年

7

如果您将目标文件视为符号链接,则首先可以检查它并获取原始文件。下面的if子句可能会对您有所帮助。

if [ -h $file ]
then
 base=$(dirname $(readlink $file))
else
 base=$(dirname $file)
fi

5

我正在玩这个,并想出了一个替代方案。

$ VAR=/home/me/mydir/file.c

$ DIR=`echo $VAR |xargs dirname`

$ echo $DIR
/home/me/mydir

我喜欢的部分是扩展备份树很容易:

$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`

$ echo $DIR
/home

1

这是我用于递归修整的脚本。当然,将$ 1替换为所需的目录。

BASEDIR="$1"
IFS=$'\n'
cd $BASEDIR
 for f in $(find . -type f -name ' *')
 do 
    DIR=$(dirname "$f")
    DIR=${DIR:1}
    cd $BASEDIR$DIR
    rename 's/^ *//' *
 done

0

首先,我已替换/为空白()。然后,我删除了任何空白()之前的所有字符。最后,我删除了第一个空白字符()。

$ VAR="/home/me/mydir/file.c"

$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c

0
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)

使用new_path = 获取完整路径$(dirname ${BASH_SOURCE[0]})。使用cd new_path更改当前目录,然后运行pwd以获取当前目录的完整路径。

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.