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


当前回答

你可以尝试这样的方法,使用如何使用'cut'找到最后一个字段:

解释

Rev将/home/user/mydir/file_name.c转换为c.eman_elif/ridym/resu/emoh/ Cut使用/作为分隔符,并选择第二个字段,即ridym/resu/emoh/,它删除了第一次出现/之前的字符串 最后,我们再次反向获取/home/user/mydir

$ VAR="/home/user/mydir/file_name.c"
$ echo $VAR | rev | cut -d"/" -f2- | rev
/home/user/mydir

其他回答

我在玩这个,然后想出了一个替代方案。

$ 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
$ 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

你可以尝试这样的方法,使用如何使用'cut'找到最后一个字段:

解释

Rev将/home/user/mydir/file_name.c转换为c.eman_elif/ridym/resu/emoh/ Cut使用/作为分隔符,并选择第二个字段,即ridym/resu/emoh/,它删除了第一次出现/之前的字符串 最后,我们再次反向获取/home/user/mydir

$ VAR="/home/user/mydir/file_name.c"
$ echo $VAR | rev | cut -d"/" -f2- | rev
/home/user/mydir

在相关的注意事项中,如果您只有文件名或相对路径,那么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