
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 CDPATH
recurso, assim como pushd
e popd
.
O CDPATH
recurso (talvez visto pela primeira vez no tcsh) é uma lista de diretórios separados por dois pontos. Se o pai do seu thedirectoryiwanttogointo
nome for razoavelmente único, você poderá adicioná-lo à lista.
Para leitura adicional (a página de manual do seu shell deve ser a primeira):
- O que é CDPATH?
- 3.4. Alterando diretórios com
cd
(Guia passo a passo do Red Hat Enterprise Linux) - Como alterar o CDPATH para os shells C: csh e tcsh
pushd
e popd
sã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 cd
comandos. 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 /home
e 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 /home
e 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, cd
para 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 yash
se 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 paiemCDPATH
ou criar uma variável de shell $FOO
que 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.