如何从路径中删除最后 2 个目录?
路径示例:
./dir1/dir2/file-example.json
我希望它是怎样的:
./dir1/
答案1
如果该路径是可变的,我建议使用专用工具。
例如,在zsh
:
file=./dir1/dir2///file-example.json
parent=$file:h:h
(头的头)。
或者使用bash
GNU 实用程序:
IFS= read -rd '' parent < <(
dirname -z -- "$file" | xargs -r0 dirname -z --)
这样做sed
意味着您必须手动实现算法,如果您想像dirname
orzsh
一样很好地处理所有情况:h
,那可能会很复杂。需要考虑的事项:
- 尾随的应该被忽略(但在输入文件是或 的
/
情况下不是全部)/
///
- 两个或多个 s 的其他序列
/
应被视为与单个序列相同/
,除非可能需要在某些系统上进行特殊处理的情况//foo/bar
(//
解释了为什么我添加///
到上面的示例中来演示)。 - 的目录名
foo
应该是.
- 的目录名
/
应该是/
- 请记住,文件路径可以包含任何非 NUL 字节序列。这包括不形成有效字符或表示换行符的字节序列。该路径可能比 LINE_MAX 长(并且某些
sed
实现不会处理比这长的行)。
sed
只要您使用-z
并在C
/语言环境中调用它,就应该可以使用 GNU 实现来完成此操作POSIX
,但这并非易事。
如果要查找文件的父目录的父目录file-example.json
,您可以这样做:
parents=(*/**/file-example.json(ND:h:h))
在 zsh 中。或者使用bash
4.4+ 和 GNU 实用程序:
readarray -td '' parents < <(
find . -mindepth 2 -name file-example.json -print0 |
LC_ALL=C gawk -F/ -v RS='\0' -v ORS='\0' '
{NF -= 2; print}'
)
获取$parents
数组中的这些目录。