从文件路径获取文件目录路径

Tal*_*Kit 357 bash

在Bash中,如果VAR="/home/me/mydir/file.c",我该如何获得"/home/me/mydir"

pax*_*blo 580

dirname并且basename是您正在寻找的用于提取路径组件的工具:

$ VAR=/home/me/mydir/file.c

$ DIR=$(dirname "${VAR}")

$ echo "${DIR}"
/home/me/mydir

$ basename "${VAR}"
file.c
Run Code Online (Sandbox Code Playgroud)

它们不是内部 Bash命令,但它们是POSIX标准的一部分(参见dirname,basename),因此应该可以在绝大多数将运行Bash的系统上使用.

  • 为什么在变量名周围使用括号,而不是"$ VAR"? (4认同)
  • /sf/ask/612418201/ 回答了上述问题。 (3认同)
  • @tripleee:“export”是我的一个习惯,只是为了确保变量传递给子shell。“echo”语句是为了展示如何将输出放入变量中,但我可能应该全力以赴(我现在已经做到了)。虽然这些都不会真正影响答案的“内容”,但我会进行调整。我总是很感激对改进我的答案的建设性批评。 (2认同)

Emm*_*aux 85

$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir

$ echo "${VAR##*/}"
file.c
Run Code Online (Sandbox Code Playgroud)

避免依赖basenamedirname

  • 但是,如果$ VAR中没有路径信息,$ {VAR%/*}/test会产生等于$ VAR/test的意外值,而$(dirname $ VAR)将产生更可预测且适当的./test值.这是一个大问题,因为前者将尝试将文件名视为目录,而后者将是正常的. (8认同)
  • 由于两者都是POSIX的一部分,因此依赖性不应成为问题. (3认同)
  • orkoden,你说得对。我的回答的目的是表明没有义务执行两个额外的过程。bash 对于用例来说是自给自足的。 (3认同)
  • 我正在使用Emmanuel的方法,因为我希望传递文件或文件夹名称,然后计算文件夹路径.使用此正则表达式是正确的,而dirname函数在我输入文件夹时返回父文件夹. (2认同)
  • 这应该可以说是公认的答案。`dirname` 和 `basename` 有它们的位置,但是如果路径已经在 shell 变量中,那么使用 shell 的内置设施比调用外部进程更高效、更优雅。 (2认同)

jer*_*ack 17

在相关的说明中,如果您只有文件名或相对路径,dirname它本身就无济于事.对我来说,答案最终成了readlink.

fname='txtfile'    
echo $(dirname "$fname")                # output: .
echo $(readlink -f "$fname")            # output: /home/me/work/txtfile
Run Code Online (Sandbox Code Playgroud)

然后,您可以将两者合并为一个目录.

echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
Run Code Online (Sandbox Code Playgroud)


Tah*_*koz 6

如果您关注目标文件是符号链接,首先您可以检查它并获取原始文件.以下if条款可以帮助您.

if [ -h $file ]
then
 base=$(dirname $(readlink $file))
else
 base=$(dirname $file)
fi
Run Code Online (Sandbox Code Playgroud)


aer*_*man 5

HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
Run Code Online (Sandbox Code Playgroud)

在那里您可以使用new_path =获得完整路径$(dirname ${BASH_SOURCE[0]})。您使用cd new_path更改当前目录,然后运行pwd以获取当前目录的完整路径。