在Bash中,若是VAR="/home/me/mydir/file.c"
,我该如何得到"/home/me/mydir"
? spa
$ export VAR=/home/me/mydir/file.c $ export DIR=${VAR%/*} $ echo "${DIR}" /home/me/mydir $ echo "${VAR##*/}" file.c
避免依赖basename
和dirname
code
若是您关注目标文件是符号连接,首先您能够检查它并获取原始文件。 如下if条款能够帮助您。 递归
if [ -h $file ] then base=$(dirname $(readlink $file)) else base=$(dirname $file) fi
在相关的说明中,若是您只有文件名或相对路径,则dirname
自己无济于事。 对我来讲,答案最终是readlink
。 扩展
fname='txtfile' echo $(dirname "$fname") # output: . echo $(readlink -f "$fname") # output: /home/me/work/txtfile
而后,您能够将二者合并为一个目录。 file
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
我正在玩这个,想出了另外一种选择。 脚本
$ VAR=/home/me/mydir/file.c $ DIR=`echo $VAR |xargs dirname` $ echo $DIR /home/me/mydir
我喜欢的部分是扩展备份树很容易: di
$ 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