Como posso usar o comando para abrir o primeiro resultado da pesquisa com o vi?

5

Sempre que preciso encontrar um arquivo e abri-lo, preciso usar: encontre ./ -name ****. propriedades. , copie o resultado e depois vi "colar o resultado aqui". Se eu precisar usar um mouse, pode ser um pequeno problema. Então, há alguma maneira melhor de fazer isso?

    
por Foolish 10.11.2010 / 09:19

7 respostas

2

Você pode abrir um arquivo arbitrário usando o AWK ou o sed para imprimir um número de linha específico.

vi "$(find ./ -name **.properties | awk 'NR==2')"

ou

vi "$(find ./ -name **.properties | awk 'NR==2{print;quit}')"

ou

vi "$(find ./ -name **.properties | sed -n '2p')"

ou

vi "$(find ./ -name **.properties | sed -n '2{p;q}')"

As versões com quit ou q retornam um pouco mais rápido se houver um grande número de arquivos.

    
por 11.11.2010 / 05:01
3
find . -name \*.properties | xargs -d '\n' vi

abrirá todos os arquivos em uma única instância de vi . Para abrir apenas o primeiro, use

find . -name \*.properties | head -1 | xargs -d '\n' vi
    
por 10.11.2010 / 11:26
3

Se você alterar seu shell para zsh, precisará de find com muito menos frequência, pois o zsh permite que você faça a maior parte do que o find pode fazer através da globulação. Para começar, **/ tem um significado especial: **/foo expande para arquivos chamados foo no diretório atual e seus subdiretórios recursivamente, ou seja, ele corresponde aos mesmos arquivos que find . -name foo . Então você pode editar todos os jogos com

vi **/*.properties

Desde o bash 4.0, se você colocar shopt -s globstar no seu ~/.bashrc , **/ se comportará da mesma maneira.

Em zsh, você tem muito mais possibilidades graças aos qualificadores glob (descritos muito próximo do final do zshexpn página man ). O princípio é restringir as partidas adicionando um ou mais qualificadores entre parênteses após a partida. Por exemplo, o qualificador . se restringe a arquivos regulares, enquanto / se restringe a diretórios. O qualificador [1] retém apenas a primeira correspondência; [1,4] retém as primeiras quatro correspondências; e assim por diante. Por exemplo, para editar o primeiro (na ordem lexicográfica do caminho completo), o arquivo regular corresponde a *.properties :

vi **/*.properties(.[1])

Se você preferir editar o arquivo de correspondência modificado mais recentemente, use o om qualifier para classificar as correspondências por horários de modificação (em ordem de aumento de idade):

vi **/*.properties(.om[1])
    
por 11.11.2010 / 00:54
1

Você pode querer olhar para a opção -quit para o comando find . O seguinte pode ser um exemplo do que você deseja realizar:

find . -name "*.properties" -print -exec vi {} \; -quit

Devo salientar que, como descobri não muito depois de postar esta resposta, a opção -quit não existe para a versão BSD do comando find , o que você provavelmente encontrará, por exemplo, em Mac OS.

    
por 10.11.2010 / 11:41
1

Acho que alguém mostrou a resposta:

find -name *.properties -exec vi {} \;

isto irá processar uma sequência de edição dos arquivos encontrados por "find -name * .properties".

Se você quiser apenas abrir o segundo arquivo:

vi "$(find -name *.properties | awk 'NR==2')"

    
por 27.08.2013 / 09:18
0

find . -name "*.properties" -exec vi {} \;

Em seguida, use a chave de interrupção (por exemplo, ^ C) depois de editar o primeiro arquivo.

    
por 10.11.2010 / 10:49
0

Você pode colocar os resultados do comando find na linha de comando para vi da seguinte forma:

vi $(find . -name \*.properties -print)

ou assim:

vi $(find -name \*.properties)

desde que . e -print estejam implícitos se omitidos. Para abrir apenas o primeiro resultado, use

vi $(find -name \*.properties | head -1)
    
por 10.11.2010 / 16:23