在Bash中,如果
VAR="/home/me/mydir/file.c"
,我该如何获取"/home/me/mydir"
?VAR="/home/me/mydir/file.c"
,我该如何获取"/home/me/mydir"
?export
是不必要的,而 echo
是无用的。 - tripleeeexport
是我的习惯,只是为了确保变量传递到子 shell。echo
语句是为了展示如何将输出存入变量,但我可能应该完全做到这一点(现在已经做到了)。虽然这两个都不会真正影响答案的“核心”,但我会进行调整。我非常感谢对改进我的回答提出建设性批评。 - paxdiablo$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
basename
和dirname
产生依赖关系dirname
和basename
有它们的用处,但如果路径已经在一个shell变量中,使用shell内置的工具比调用外部进程更高效、更优雅。 - tripleee相关的是,如果你只有文件名或相对路径,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
readlink -m“$fname”
递归地将给定名称规范化。 - EDkanif [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
你可以通过 new_path=$(dirname ${BASH_SOURCE[0]})
获取完整路径。使用 cd
new_path 更改当前目录,然后运行 pwd
以获取当前目录的完整路径。
$ 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
解释
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
以下是我用于递归修剪的脚本。当然,将$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
for
循环遍历find
的输出是一种反模式,也是许多错误的根源。这种结构本质上是有限制的,如果find
产生包含空格或其他shell元字符(更不用说换行符)的结果,则会失败。 - tripleee我喜欢我的路径是绝对的,并且我需要从(第一个)bash参数获取它(不是变量,不是$pdf
,不是脚本位置):
也就是说,要可靠地在我选择的文件($1)旁边创建一个子文件夹:
rp="$(realpath $(dirname $1)/pfd_extract)"
mkdir -p "$rp"