我有这个:
find . -type f -name '*_test.go' | xargs dirname
但我得到:
用法:目录名路径
的输出
$ find . -type f -name '*_test.go'
是:
./pkg_test.go
./v3/organization/organization_test.go
./v3/common/pkg_test.go
./v3/model/boil_main_test.go
./v3/model/boil_queries_test.go
./v3/model/advances_test.go
./v3/model/boil_suites_test.go
./v3/model/psql_main_test.go
./v3/model/psql_suites_test.go
有谁知道我怎样才能得到文件的目录名?也许我需要绝对路径?
三种方式:
首先,您的
xargs
方式失败了,因为您一次提供dirname
了多个路径名。相反,将路径名一一传递给它:-print0
withfind
和-0
with将xargs
路径名作为 nul 分隔列表而不是换行分隔列表传递。-r
如果xargs
没有dirname
来自find
. _如果您知道您的文件名不包含嵌入的换行符:
其次,调用一个在文件
find
上运行的内嵌 shell 脚本dirname
:或者,不要调用
dirname
,而是在循环中使用参数替换(更快):第三,如果您使用的是 GNU
find
,请使用它-printf
:最后,如果您使用的是
zsh
:(.ND:h)
glob 修饰符要求之前的通配模式仅扩展为常规文件 ( ).
,如果没有匹配该模式的文件 (N
,如nullglob
inbash
),则扩展为空,并且还包括隐藏名称 (D
,如dotglob
inbash
)。最后:h
的 导致返回每个匹配路径名的“头”(即没有文件名的路径名的目录部分)。bash
你可以用这样的循环做一些等效的事情: