在bash中获取文件的父目录

Vas*_*kov 2 linux bash shell sh

如何获取文件的父目录?

我希望它对所有类型的名称都是安全的:

.
..
path/to/my/file
/absolute/path/to/my/file
'-rf --no-preserve-root whatever'/test.zip
(symbolic links)
`'"`'{(})
Run Code Online (Sandbox Code Playgroud)

我更感兴趣的是获取文件系统上的规范位置,而不是遍历文件名中指定的路径.

请注意,这个问题有类似的问题,但没有一个关注正确性,相对/绝对路径和"不安全"名称:

[1] bash获取当前目录的父目录

[2] 检索脚本的父目录

[3] bash文件路径到文件的父目录

Vas*_*kov 6

真正安全的解决方案:

parent_dir="$(dirname -- "$(realpath -- "$file_name")")"
Run Code Online (Sandbox Code Playgroud)

如果您的系统没有,realpath但确实有readlink,这应该有效:

parent_dir="$(dirname -- "$(readlink -f -- "$file_name")")"
Run Code Online (Sandbox Code Playgroud)

  • @kdhp:尽管macOS Sierra(以及之前的Mac OS X)是从BSD派生的,但默认情况下它们不包含`realpath`命令.在我的机器上,我有命令的实现和命令的GNU实现.并且,鉴于`realpath`未标准化(例如通过POSIX),FreeBSD和GNU实现不太可能完全兼容.幸运的是,他们有一个共同的功能子集.在macOS上有一个`readlink`命令,但它的选项远远少于GNU的版本(它有`-n`选项,两者看起来都是一样的). (2认同)
  • `printf'%s \n'"$(dirname ...)"`与简单地使用`dirname ...`相比有什么好处? (2认同)