Supondo que nenhum dos nomes de arquivo contenha caracteres de nova linha:
find "$PWD" -name __openerp__.py | awk -F/ -vOFS=/ 'NF-=2' | sort -u
o que eu quero fazer é encontrar todos os arquivos com base em alguma consulta de pesquisa e obter o diretório pai dos pais ( ../..
) caminho completo.
Por exemplo, find . -name "__openerp__.py"
e, em seguida, para cada arquivo, execute algo nos moldes de (cd ../..; pwd)
. Em seguida, canalize tudo para uniq
.
Deixando de lado que haveria problemas com nomes de arquivos que contêm novas linhas, há algumas melhorias de eficiência nas quais posso pensar:
$PWD
diretamente para encontrar, em vez de determiná-lo para cada sub-shell. Isso fará com que find
inclua o caminho completo em sua saída. rev
e cut
. Portanto, sugiro o seguinte para obter uma lista de todos os diretórios que contenham o arquivo desejado:
find "$PWD" -name '__openerp__.py' |
rev |
cut -d/ -f3- |
rev
Note que find
não ordena sua saída, então deve ser classificado antes de uni-lo. Como sort
já suporta elementos idênticos (-u switch), a pergunta original pode ser respondida com:
find "$PWD" -name '__openerp__.py' |
rev |
cut -d/ -f3- |
rev |
sort -u
Se bem entendi, você quer a lista de diretórios contendo um subdiretório contendo um arquivo chamado __openerp__.py
, sem duplicatas.
No zsh:
print -rl -- **/__openerp__.py(:h:h) | sort -u
ou
a=(**/__openerp__.py(:h:h)); print -rl -- ${(u)a}
find . -name "__openerp__.py" -exec sh -c '(cd "{}"/../../; pwd)' \; | uniq