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


当前回答

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

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

避免与basename和dirname的依赖

其他回答

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

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的平台上可用或可以获得。

你可以尝试这样的方法,使用如何使用'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

我喜欢我的路径绝对,我需要它从(第一个)bash参数(不是一个变量,不是$pdf,不是脚本位置):

例如,在我选择的文件($1)旁边可靠地创建一个子文件夹:

rp="$(realpath $(dirname $1)/pfd_extract)"
mkdir -p "$rp"