Por que o curinga * não funciona ao alterar diretórios?

Por que o curinga * não funciona ao alterar diretórios?

Por exemplo, estou no meu diretório:

/home/myname

e então quero colocar o CD em um diretório diferente.

/home/pulsar/... 

Como preciso me aprofundar no outro diretório, como posso fazer isso sem precisar digitar a linha inteira? tentei

cd */thedirectoryiwanttogointo

mas isso não funciona. Eu tenho que digitar a linha inteira.

Responder1

Provavelmente o seu curinga não funciona porque:

  • não houve correspondências para o curinga do local que você forneceu ou
  • houve mais de uma partida.

A abordagem usual (em um shell) para mover-se frequentemente entre subdiretórios é usar o CDPATHrecurso, assim como pushde popd.

O CDPATHrecurso (talvez visto pela primeira vez no tcsh) é uma lista de diretórios separados por dois pontos. Se o pai do seu thedirectoryiwanttogointonome for razoavelmente único, você poderá adicioná-lo à lista.

Para leitura adicional (a página de manual do seu shell deve ser a primeira):

pushde popdsão mais recentes que CDPATH, mas ainda datam de meados da década de 1990. Eles permitem que você salve seu diretório atual ("empurrando" para uma pilha) e restaure-o ("retirando" de uma pilha) durante seus respectivos cdcomandos. Para leitura adicional:

Outras pessoas usam aliases de shell ou links simbólicos. Eles são mais úteis quando se vai a locais conhecidos.

Responder2

Supondo que todos os diretórios de destino possíveis estejam abaixo /homee não haja caracteres de nova linha nos nomes dos diretórios, você pode usar esta função shell:

cds() {
    cd "$(find /home -type d -name "$1" | head -n 1)"
}

$ cds thedirectoryiwanttogointo

É claro que, dependendo de quantos subdiretórios e arquivos estão contidos /homee da capacidade do seu sistema operacional de armazenar em cache toda a árvore na memória ou não, o desempenho irá variar significativamente.

Em sistemas GNU, você pode acelerá-lo e torná-lo mais confiável com caracteres de nova linha em nomes de arquivos usando esta sintaxe:

cds() {
    cd "$(find /home -type d -name "$1" -print -quit)"
}

Isso interromperá a pesquisa assim que a primeira correspondência for encontrada.

Observe que o argumento é considerado um padrão, então você pode fazer:

cds 'foo*bar'

por exemplo, cdpara o primeiro diretório (a ordem não é especificada) cujo nome começa comfoo e termina com bar.

Responder3

Você deseja que a expansão curinga encontre um caminho em qualquer lugar do sistema. Você pode fazer isso se especificar o padrão corretamente:

cd /**/thedirectoryiwanttogointo

funcionará em zsh e fish por padrão,no Bash se você primeiroshopt -s globstar, emtcsh se vocêset globstar, em ksh93 se você set -o globstar, em yashse vocêset -o extended-glob .

Isso funciona porque o curinga é usado em um caminho absoluto começando com, /em vez de ser relativo ao diretório atual, e quando você opta por usar o** padrão, ele se expande para qualquer número de subdiretórios.

Embora isso funcione,é provável que demore muito tempo. Seu shell precisa pesquisar em todo o sistema os arquivos correspondentes. Você pode reduzir isso fornecendo um prefixo mais longo para eliminar mais espaço de pesquisa:

cd /home/pulsar/**/thedirectoryiwanttogointo/

Quanto mais você detalhar, menos pesquisas haverá para fazer. Se a árvore de diretórios for bastante esparsa, isso não demorará muito e será realmente prático de usar. O rastreamento /garante que a expansão seja apenas para um diretório, o que elimina uma variedade de ambigüidades que podem ocorrer.

Se ainda houver mais de uma correspondência, o resultado dependerá do seu shell. Bash e fish mudarão para a primeira correspondência em ordem alfabética, ignorando a ambigüidade. tcsh e yash reportarão um erro. zsh e ksh irão interpretar isso como uma tentativa de usar um de seus recursos avançados de troca de diretório eprovavelmentereportar um erro.


Se você provavelmente usará o mesmo diretório repetidamente, coloque o paiemCDPATHou criar uma variável de shell $FOOque você possa usar no lugar do caminho longo é uma opção melhor. Você pode combinar a variável shell com **a expansão para economizar mais digitação se a usar com frequência.

Responder4

Se você sempre acessa o mesmo diretório profundo, uma solução simples é apenas criar um link simbólico para ele:

ln -s ~/foo/bar/baz/quux/etc/etc/etc/target ~/shortcut

Se você já acessou o diretório antes, outra solução é pesquisar no histórico de comandos o nome desejado; pressione ctrl-R e os caracteres a serem pesquisados. Isso é específico do bash, mas imagino que a maioria dos shells modernos tenha um recurso semelhante.

informação relacionada