从文件路径获取文件目录路径

时间:2011-05-25 07:41:45

标签: bash

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

8 个答案:

答案 0 :(得分:527)

dirnamebasename是您正在寻找的用于提取路径组件的工具:

$ VAR=/home/me/mydir/file.c

$ DIR=$(dirname "${VAR}")

$ echo "${DIR}"
/home/me/mydir

$ basename "${VAR}"
file.c

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

答案 1 :(得分:77)

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

$ echo "${VAR##*/}"
file.c

避免依赖basenamedirname

答案 2 :(得分:16)

在相关的说明中,如果您只有文件名或相对路径,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

答案 3 :(得分:6)

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

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

答案 4 :(得分:4)

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

$ 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

答案 5 :(得分:2)

HERE=$(cd $(dirname $BASH_SOURCE) && pwd)

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

答案 6 :(得分:1)

这是我用于递归修剪的脚本。当然,将$ 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

答案 7 :(得分:0)

首先,我将/替换为空白()。然后,我删除了任何空白()之前的所有字符。最后,我删除了第一个为空白字符()。

$ VAR="/home/me/mydir/file.c"

$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c