在Bash中,如果VAR=“/home/me/mydir/file.c”,我如何得到“/home/me/mydir”?
当前回答
这是我用于递归修剪的脚本。当然,将$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
其他回答
我在玩这个,然后想出了一个替代方案。
$ 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
在相关的注意事项中,如果您只有文件名或相对路径,那么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
如果你关心的目标文件是符号链接,首先你可以检查它,得到原始文件。下面的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的依赖