Eu tenho isto:
find . -type f -name '*_test.go' | xargs dirname
mas eu recebo:
uso: caminho do dirname
a saída de
$ 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
alguém sabe como posso obter o dirname do arquivo? Talvez eu precise de caminhos absolutos?
Três caminhos:
Primeiro, seu
xargs
caminho falha porque você fornecedirname
mais de um nome de caminho por vez. Em vez disso, passe os nomes de caminho um por um para ele:O
-print0
withfind
e-0
withxargs
passa os nomes de caminho como uma lista delimitada por nulo em vez de como uma lista delimitada por nova linha. A-r
opção paraxargs
garantirá quedirname
não seja executada se não houver entrada defind
.Se você souber que seus nomes de arquivo não contêm novas linhas incorporadas:
Em segundo lugar, chame um script de shell in-line
find
que é executadodirname
nos arquivos um por um:Como alternativa, não chame,
dirname
mas use uma substituição de parâmetro no loop (mais rápido):Em terceiro lugar, se você estiver usando GNU
find
, use seu-printf
:Por fim, se você estiver usando
zsh
:O
(.ND:h)
modificador glob pede ao padrão globbing anterior para expandir apenas para arquivos regulares (.
), e para expandir para nada se não houver arquivos correspondentes ao padrão (N
, comonullglob
embash
), e também incluir nomes ocultos (D
, comodotglob
embash
). O:h
no final faz com que o "head" de cada nome de caminho correspondente seja retornado (ou seja, a parte do diretório do nome de caminho sem o nome do arquivo).Você poderia fazer algo equivalente
bash
com um loop assim: