在Bash中,如果VAR=“/home/me/mydir/file.c”,我如何得到“/home/me/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
其他回答
这是我用于递归修剪的脚本。当然,将$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的平台上可用或可以获得。
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
避免与basename和dirname的依赖
我在玩这个,然后想出了一个替代方案。
$ 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
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
通过new_path=$(dirname ${BASH_SOURCE[0]})获得完整路径。使用cd new_path更改当前目录,然后运行pwd获取当前目录的完整路径。