从文件path获取文件目录path
在Bash中,如果VAR="/home/me/mydir/file.c"
,我如何得到"/home/me/mydir"
?
dirname
和basename
是你正在寻找的提取path组件的工具:
$ VAR=/home/me/mydir/file.c $ DIR=$(dirname "${VAR}") $ echo "${DIR}" /home/me/mydir $ basename "${VAR}" 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
依赖关系
在一个相关的说明,如果你只有文件名或相对path, 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
我正在玩这个,并提出了一个替代scheme。
$ 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
这是我用于recursion修剪的脚本。 当然,用你想要的目录replace$ 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