print caminho completo de diretórios pai de localizar saída

2

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 .

    
por JackLeo 29.01.2014 / 13:30

4 respostas

5

Supondo que nenhum dos nomes de arquivo contenha caracteres de nova linha:

find "$PWD" -name __openerp__.py  | awk -F/ -vOFS=/ 'NF-=2' | sort -u
    
por 29.01.2014 / 14:05
3

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:

  1. Passe o $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.
  2. Cortar nomes de diretório-pai com 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
    
por 29.01.2014 / 14:06
2

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}
    
por 30.01.2014 / 01:04
-1
find . -name "__openerp__.py" -exec sh -c '(cd "{}"/../../; pwd)' \; | uniq
    
por 29.01.2014 / 13:34