在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