在Bash中,如果VAR="/home/me/mydir/file.c",我如何得到"/home/me/mydir"?
VAR="/home/me/mydir/file.c"
"/home/me/mydir"
dirname和basename是你正在寻找的提取路径组件的工具:
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的平台上可用或可以获得。
bash
$ export VAR=/home/me/mydir/file.c $ export DIR=${VAR%/*} $ echo "${DIR}" /home/me/mydir $ echo "${VAR##*/}" file.c
避免依赖basename和dirname
如果你关心的目标文件是符号链接,首先你可以检查它,得到原始文件。下面的if从句可以帮助你。
if [ -h $file ] then base=$(dirname $(readlink $file)) else base=$(dirname $file) fi
在相关的注意事项中,如果您只有文件名或相对路径,那么dirname本身是没有帮助的。对我来说,答案是readlink。
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
我在玩这个,然后想出了一个替代方案。
$ 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
你可以尝试使用如何使用“cut”找到最后一个字段这样的方法:
解释
rev
/home/user/mydir/file_name.c
c.eman_elif/ridym/resu/emoh/
cut
/
ridym/resu/emoh/
/home/user/mydir
$ VAR="/home/user/mydir/file_name.c" $ echo $VAR | rev | cut -d"/" -f2- | rev /home/user/mydir
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
在这里,您可以使用new_path=$(dirname ${BASH_SOURCE[0]})获得完整的路径。您使用cd new_path更改当前目录,然后运行pwd以获得当前目录的完整路径。
$(dirname ${BASH_SOURCE[0]})
cd
pwd
我喜欢我的路径绝对,我需要它从(第一个)bash参数(不是一个变量,不是$pdf,不是脚本位置):
$pdf
例如,在我选择的文件($1)旁边可靠地创建一个子文件夹:
rp="$(realpath $(dirname $1)/pfd_extract)" mkdir -p "$rp"