在Bash中,VAR="/home/me/mydir/file.c"
如何获得"/home/me/mydir"
?
在Bash中,VAR="/home/me/mydir/file.c"
如何获得"/home/me/mydir"
?
Answers:
dirname
以及basename
您正在寻找的提取路径分量的工具:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
他们不是内部的Bash命令,但他们是POSIX标准的一部分(见dirname
,basename
)等应可在绝大多数将要运行bash的系统。
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
为了避免对basename
和的依赖dirname
值得一提的是,如果只有文件名或相对路径,那么单独使用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
readlink -m "$fname"
递归规范化给定名称
如果您将目标文件视为符号链接,则首先可以检查它并获取原始文件。下面的if子句可能会对您有所帮助。
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
我正在玩这个,并想出了一个替代方案。
$ 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