encontra a pasta correspondente mais próxima

3

Qual é a melhor maneira de classificar os resultados de $ find . -name scripts -type d pelas ocorrências de '/' e depois escolher o primeiro resultado.

Eu quero criar uma função que vá para uma pasta comum em um projeto. Eu queria que fosse flexível com base no seu diretório relativo.

Então, se eu tiver 10 projetos, todos com estrutura de pastas semelhante:

~/project-a/project/folder/structure
~/project-b/project/folder/structure
~/project-c/project/folder/structure

Eu poderia:

$ cd ~/project-a
$ cdd structure

E desça em ~ / project-a / project / folder / structure

Atualizar

Não consigo classificar os resultados de maneira previsível, por exemplo:

$ find . -type d -name "themes"

./wp-content/plugins/contact-form-7/includes/js/jquery-ui/themes
./wp-content/plugins/jetpack/modules/infinite-scroll/themes
./wp-content/plugins/smart-youtube/themes
./wp-content/plugins/wptouch-pro/themes
./wp-content/themes
./wp-includes/js/tinymce/themes

Eu gostaria que a função cdd fosse suspensa para o resultado mais próximo. Neste exemplo, seria ./wp-content/themes .

    
por drrobotnik 24.07.2015 / 03:53

2 respostas

0

Talvez com o recurso de curinga recursiva de bash:

shopt -s globstar  # in ~/.bashrc, or just in cdd () {}
cd **/structure/

Acho que a expansão ** acontecerá mais ou menos na mesma ordem da pesquisa e, portanto, terá a maioria dos mesmos problemas. Mas é tão fácil e útil que você pode ignorar isso!

    
por 24.07.2015 / 04:22
0

Você não pode usar e alias para esse problema, porque um alias não pode receber argumentos no meio, apenas no final. Você precisa de uma função para isso.

A seguinte função faz o que você está pedindo:

cdd() { 
   cd 'find . -type d -name "$1"|head -n1'
}

Você terá que adicionar estas linhas ao seu arquivo .profile (ou arquivo .bashrc), para que ele seja executado (uma vez) quando você efetuar login.

Para testes, você pode colocá-lo em um arquivo, por exemplo chamado func.sh e, em seguida, fonte-lo (ou seja, executá-lo usando o operador ".") para que ele se torne parte do seu ambiente:

. ./func.sh

Nota: Se você fizer alterações no arquivo func.sh , precisará fazer o mesmo novamente.

Você pode usá-lo como:

cdd <dirname>

A função, como é agora, irá procurar por um diretório com o nome <dirname> no caminho atual e abaixo e irá cd para a primeira ocorrência que encontrar ( head -n1 ).

Você pode ajustar a operação find para obter o resultado desejado primeiro. Veja man find .

Para encontrar a correspondência mais próxima, você pode classificar a saída da localização para fornecer a linha mais curta:

find . -type d -name "$1"| awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2- | head -n1

(O comando awk foi roubado de aqui .)

Isso retornará a linha mais curta na saída do find. No entanto, ele retornará o diretório errado se, por exemplo, você estiver procurando pelo diretório proj e tiver uma estrutura como esta:

./d1/d2/d3/proj
./longdirname/proj

Como alternativa, você pode contar o número de caracteres / no resultado para contornar isso.

    
por 24.07.2015 / 08:34