在Bash中,如果VAR=“/home/me/mydir/file.c”,我如何得到“/home/me/mydir”?


当前回答

如果你关心的目标文件是符号链接,首先你可以检查它,得到原始文件。下面的if从句可以帮助你。

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

其他回答

Dirname和basename是你正在寻找的提取路径组件的工具:

$ VAR='/home/pax/file.c'
$ DIR="$(dirname "${VAR}")" ; FILE="$(basename "${VAR}")"
$ echo "[${DIR}] [${FILE}]"
[/home/pax] [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的依赖

如果你关心的目标文件是符号链接,首先你可以检查它,得到原始文件。下面的if从句可以帮助你。

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

在相关的注意事项中,如果您只有文件名或相对路径,那么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
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)

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