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


当前回答

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

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

其他回答

这是我用于递归修剪的脚本。当然,将$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
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir

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

避免与basename和dirname的依赖

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

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

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

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

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

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

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