在Bash中,如果VAR="/home/me/mydir/file.c"
,我如何获得"/home/me/mydir"
?
答案 0 :(得分:527)
dirname
和basename
是您正在寻找的用于提取路径组件的工具:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
它们不是内部 Bash命令,但它们是POSIX标准的一部分(请参阅dirname
,basename
),因此绝大多数都应该可用将运行Bash的系统。
答案 1 :(得分:77)
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
避免依赖basename
和dirname
答案 2 :(得分:16)
在相关的说明中,如果您只有文件名或相对路径,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
答案 3 :(得分:6)
如果您关注目标文件是符号链接,首先您可以检查它并获取原始文件。下面的if子句可以帮助你。
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
答案 4 :(得分:4)
我正在玩这个,想出了一个替代方案。
$ 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
答案 5 :(得分:2)
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
使用 new_path = $(dirname ${BASH_SOURCE[0]})
获取完整路径。您可以使用cd
new_path 更改当前目录,然后运行pwd
以获取当前目录的完整路径。
答案 6 :(得分:1)
这是我用于递归修剪的脚本。当然,将$ 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
答案 7 :(得分:0)
首先,我将/
替换为空白()。然后,我删除了任何空白(
)之前的所有字符。最后,我删除了第一个为空白字符(
)。
$ VAR="/home/me/mydir/file.c"
$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c