从文件path获取文件目录path

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

dirnamebasename是你正在寻找的提取path组件的工具:

 $ VAR=/home/me/mydir/file.c $ DIR=$(dirname "${VAR}") $ echo "${DIR}" /home/me/mydir $ basename "${VAR}" file.c 

它们不是内部的 Bash命令,但是它们是POSIX标准的一部分(请参阅dirnamebasename ),因此绝大多数将运行Bash的系统都应该可用。

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

为了避免与basenamedirname依赖关系

在一个相关的说明,如果你只有文件名或相对path, 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 

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

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

我正在玩这个,并提出了一个替代scheme。

 $ 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 

这是我用于recursion修剪的脚本。 当然,用你想要的目录replace$ 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