Se você estiver apenas alternando entre dois diretórios, poderá usar cd -
para ir e voltar.
Eu gostaria de alternar frequentemente entre diretórios que estão em caminhos totalmente não relacionados, por exemplo /Project/Warnest/docs/
e ~/Dropbox/Projects/ds/test/
.
Mas não quero digitar cd /[full-path]/
o tempo todo. Existe algum comando de atalho para mudar para diretórios trabalhados anteriormente?
Uma solução que consegui pensar é adicionar variáveis de ambiente ao meu bash
.profile
para os diretórios usados com frequência e cd
para eles usando essas variáveis.
Mas existe alguma outra solução para isso?
Se você estiver apenas alternando entre dois diretórios, poderá usar cd -
para ir e voltar.
Há uma variável de shell CDPATH
em bash
e ksh
e cdpath
em zsh
:
CDPATH The search path for the cd command. This is a colon-separated list of directories in which the shell looks for destination directories specified by the cd command.
Para que você possa definir em seu ~ / .bashrc:
export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds
Em seguida, cd docs
e cd test
levarão você ao primeiro diretório encontrado. (Quero dizer, mesmo que exista um diretório com o mesmo nome no diretório atual, CDPATH
ainda será consultado. Se CDPATH
contiver mais diretórios com subdiretórios com o nome especificado, o primeiro será usado.)
Outra coisa que você pode tentar é uma ferramenta chamada autojump . Ele mantém um banco de dados de chamadas para seu alias ( j
por padrão) e tenta tomar decisões inteligentes sobre onde você quer ir. Por exemplo, se você digitar com freqüência:
j ~/Pictures
Você pode usar o seguinte para chegar ao ponto desejado:
j Pic
Ele está disponível no Debian e no Ubuntu, e incluído por usuário em ~/.bashrc
ou ~/.zshrc
por padrão.
Se for um pequeno número de diretórios, você pode usar pushd
para alternar entre eles:
# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test
ao contrário de cd -
, você pode usar isso com mais de dois diretórios
Seguindo a sugestão de Noach, estou usando agora:
function pd()
{
if [[ $# -ge 1 ]];
then
choice="$1"
else
dirs -v
echo -n "? "
read choice
fi
if [[ -n $choice ]];
then
declare -i cnum="$choice"
if [[ $cnum != $choice ]];
then #choice is not numeric
choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
cnum="$choice"
if [[ -z $choice || $cnum != $choice ]];
then
echo "$choice not found"
return
fi
fi
choice="+$choice"
fi
pushd $choice
}
uso de exemplo:
# same as pushd +1
$ pd 1
# show a prompt, choose by number
$ pd
0 ~/Dropbox/Projects/ds/test
1 /Project/Warnest/docs
2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs
# or choose by substring match
$ pd
0 /tmp
1 ~/Dropbox/Projects/ds/test
2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test
# substring without prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp
Obviamente, isso é apenas para girar a pilha e não é possível adicionar novos caminhos - talvez eu deva renomeá-lo.
Eu uso alias
no bashrc para fazer esses cds.
como:
alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
Eu encontrei um script (normalmente chamado acd_funch.sh) que resolveu esse problema para mim. Com isso, você pode digitar cd --
para ver os últimos 10 diretórios que você usou. Será algo parecido com isto:
0 ~/Documents/onedir
1 ~/Music/anotherdir
2 ~/Music/thirddir
3 ~/etc/etc
Para ir para ~/Music/thirddir
, basta digitar cd -2
OBSERVAÇÃO: Este script foi originalmente publicado em um artigo da Gazeta do Linux que está disponível aqui: acd_func.sh - estende o CD do bash para manter, exibir e acessar o histórico de nomes de diretórios visitados .
Experimente a opção cdable_vars
shell no bash. Você o liga com shopt -s cdable_vars
.
Então você precisa definir suas variáveis export dir1=/some/path
. e finalmente cd dir1
, etc.
Você pode colocá-lo no seu ~/.bashrc
para colocá-lo em pé.
Use "pushd -n " (supondo que você use o bash).
Adicione ao seu ~ / .bashrc:
pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/
então,
cd ~
é sua casa,
cd ~1
é ~/Dropbox/Projects/ds/test/
cd ~2
é /Project/Warnest/docs/
Você pode usar ~1
, ~2
etc exatamente da mesma maneira que ~
.
Há muitas boas sugestões aqui. O que usar dependerá se você tem uma pequena lista fixa de diretórios com os quais você alterna ou se está procurando uma solução mais genérica.
Se for uma pequena lista fixa, a configuração de aliases simples (como Felix Yan sugeriu) seria mais fácil de usar.
Se você está procurando uma solução mais generalizada (ou seja, muitos diretórios diferentes, mudando com o tempo), eu usaria pushd e popd (como Useless sugerido). Eu pessoalmente acho que o padrão pushd / popd é difícil de usar, especialmente quando você começa a alternar entre muitas pastas; no entanto eu escrevi alguns ajustes que tornam muito mais fácil para mim. Adicione o seguinte ao seu bashrc:
alias dirs='dirs -v'
pd ()
{
if [ "$1" ]; then
pushd "${1/#[0-9]*/+$1}";
else
pushd;
fi > /dev/null
}
pd
(como uma forma mais curta de pushd
) para pular para uma nova pasta, lembrando onde você estava. dirs
para ver a lista de diretórios salvos. pd 3
para ir para o diretório número 3. Exemplo de uso:
$ PS1='\w\$ ' ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
0 /etc/defaults
1 /tmp
2 ~/Dropbox/Public
3 ~/Documents/spec
4 ~/Documents/data
5 ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
0 ~/Dropbox/Public
1 ~/Documents/spec
2 ~/Documents/data
3 ~
4 /etc/defaults
5 /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
0 /etc/defaults
1 /tmp
2 ~/Dropbox/Public
3 ~/Documents/spec
4 ~/Documents/data
5 ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$
O seguinte pareceu funcionar no único caso em que eu testei, e você pode simplesmente colocar seus nomes de diretórios como links simbólicos em ~ / Marcadores:
mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"
function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }
ccd testdir && echo $PWD
# gives /tmp
Você poderia fazer algo pior do que tentar j2 .
A partir do README:
Spend a lot of time cd-ing around a complex directory tree?
j keeps track of where you’ve been and how much time you spend there, and provides a convenient way to jump to the directories you actually use.
Eu uso extensivamente & recomendo.
Eu aconselharia usando o zsh , que é um bom complemento de TAB para diretórios, arquivos e até mesmo opções para a maioria dos programas cli .
Eu tenho usado esse shell há anos e perderia a funcionalidade se ele tivesse desaparecido. O script do zsh também é muito divertido, com um grande número de frases de efeito que podem ajudá-lo a dia.
Na minha experiência, a maior aceleração na navegação em um shell é usar sua funcionalidade de pesquisa de histórico. No Bash você pode pesquisar para trás no seu histórico de comandos pressionando Ctrl
+ R
e digitar algum padrão. Esse padrão é então comparado com entradas anteriores em seu histórico - podem ser comandos cd
ou outras operações - e sugestões são feitas enquanto você digita. Basta apertar enter para executar o comando sugerido novamente. Isso é chamado de reverse-search-history
no Bash e eu adoro isso. Isso me poupa de muitos toques de tecla e poupa minha memória interna.
É uma coisa boa porque você só precisa lembrar de uma parte menor de um comando, como Drop
ou Wa
para distinguir entre as duas entradas do histórico cd ~/Dropbox/Projects/ds/test/
e cd /Project/Warnest/docs/
.
Eu também uso esses aliases (adicione-os a ~ / .bashrc):
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
É muito mais rápido ir para o diretório superior com eles (mas isso só resolve metade da navegação).
se você estiver usando zsh:
você não precisa digitar cd
, basta digitar o caminho do diretório ( /foo/bar/baz<Enter>
é igual a cd /foo/bar/baz<Enter>
)
requer que a opção auto_cd
seja definida
Tab
key ( /u/sh/pi<Tab>
expande para /usr/share/pixmaps
; também funciona para nomes de arquivos) Existe uma ferramenta bastante interessante para alterações rápidas no diretório:
xd - trocador de diretório eXtra rápido link
um pouco estranho é que você precisa mapeá-lo no perfil do bash ou similar, já que apenas envia o
diretório# function to do 'cd' using 'xd'
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f()
{
cd '/usr/bin/xd -g $*'
}
você pode fazer coisas como:
# change to /var/log/a* (gives you a list to choose from)
f vla
# to skip the list and go directly to /var/log/apache2
f vlapach
Você nunca deve digitar o caminho completo no shell de qualquer maneira. Você sempre pode usar:
soffice /P*/W*/*/mydoc*
em vez de
soffice /Project/Warnest/docs/mydoc.odt
Há também OLDPWD
, uma variável de ambiente que, de acordo com o IEEE 1003.1 (POSIX), deve ser atualizada com o diretório de trabalho anterior sempre que cd
alterar o diretório de trabalho (para os curiosos, linha 80244 da página 2506 IEEE 1003.1-2008).
Há também um aplicativo "wcd" criado especificamente para isso (também portado para o cygwin, já que estou nisso). Você pode criar atalhos, marcadores de diretórios com ele. Também suporta cartões selvagens. Lendo a man page & docs em / usr / share / wcd deve ajudar muito.
cdargs é a ferramenta mais eficiente para marcar um diretório: link
Experimente o fastcd ( link ) Ele define hook que registra diretórios visitados do bash. E define o script como "j" alias, que mostra os últimos diretórios visitados, com a capacidade de rapidamente cd (começar a digitar para filtrar diretórios). A modificação de .bashrc é necessária para criar o alias "j".
Obtendo ferramenta
cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd
Instale os módulos necessários
pip install --user urwid
Envie o arquivo set.sh para o seu bashrc
echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc
E atualize o bashrc
source ~/.bashrc
Em seguida, basta digitar "j" no console
Eu fiz a mesma pergunta e encontrei primeiro esta resposta . Eu instalei o utilitário z ( link ).
Isso é exatamente o que você procura, porque z aprende com seus comandos de cd e mantém o controle dos diretórios de acordo com o princípio frecency (frequente & recente). Então, depois de fazer os dois comandos cd uma vez, você pode fazer algo como:
z docs
z ds
para ir para /Project/Warnest/docs/
e ~/Dropbox/Projects/ds/test/
, respectivamente. Os argumentos para z são regexes, então você nem precisa digitar um nome completo de pasta.
Atualização (2016): agora uso FASD para isso, o que permite uma pesquisa difusa baseada em seus diretórios mais recentes.
Eu criei uma ferramenta para isso, em Ruby. Ele permite que você use arquivos YAML para declarar seus projetos.
Eu escrevi um pequeno artigo sobre isso aqui: link
Também postei a fonte no GitHub: link
Eu tenho usado meu próprio utilitário cdhist para gerenciar isso por muitos anos. Ele alias seu comando cd e mantém automaticamente uma pilha de diretórios.
Você pode usar export
para atribuir seus caminhos de diretório a variáveis e, em seguida, referenciá-los.
export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2
Algumas sugestões aqui:
Idéia mais direta, adicionarei o alias no arquivo .profile
vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'
Em seguida, use $ dir1
ou dir2
, pode cd
Se você está sempre mudando em apenas dois dirs. usar cd -
alternará entre eles.
A solução que eu uso para essa situação é screen
. Inicie a tela e crie uma janela para cada diretório com C-a c
e navegue até lá. Altere entre janelas / diretórios com C-a n
ou C-a p
. Nomeie as janelas com C-a A
. Em seguida, você pode abrir uma lista de suas janelas com C-a "
e navegar usando o número da janela ou o nome. Como é screen
, você pode desanexar da sessão salvando seu espaço de trabalho e anexar novamente com a mesma configuração.
Eu nunca gostei de pushd
e popd
porque eles exigem previsão. Parafuso que, vamos apenas acompanhar os últimos vários diretórios por conta própria e, em seguida, disponibilizá-los com uma função de cd-para-old-dirs. Eu chamo de cdo
. Coloque isso no seu arquivo rc (por exemplo, ~/.bashrc
):
function precmd() { __path_log; } # to install in zsh, harmless in bash
PROMPT_COMMAND="__path_log" # to install in bash, harmless in zsh
# Populate the array DIRHIST with the last 8 dirs visited (not for direct use)
__path_log() {
local d dh first=true
if [ -d "$__DIRHIST" ] && [ "$__DIRHIST" != "$PWD" ]; then
# $__DIRHIST is the last dir we saw, but we miss foo in 'cd foo; cd bar'
# so we use $OLDPWD to catch it; so you'd need a THIRD change to fool us.
for d in "$__DIRHIST" "${DIRHIST[@]}"; do
if [ -n "$first" ]; then unset DIRHIST first; DIRHIST[1]="$OLDPWD"; fi
if [ "$OLDPWD" = "$d" ] || [ "$PWD" = "$d" ] || [ ! -d "$d" ]; then
continue
fi
dh=$((1+${#DIRHIST[@]}))
[ $dh -lt 9 ] && DIRHIST[$dh]="$d" # push up to 8 directories
done
elif [ -z "$__DIRHIST" ]; then
DIRHIST[1]="$OLDPWD"
fi
__DIRHIST="$PWD"
}
cdo() {
local d n=0
if [ -z "${DIRHIST[1]}" ] || [ -z "$1" ]; then
cd ${OLDPWD+"$OLDPWD"}
return $?
fi
case "$1" in
0 ) cd ;;
ls ) for d in "${DIRHIST[@]}"; do
echo "$((n=n+1)) <$d>"
done |column |GREP_COLOR='0;32' grep --color -e '\b[0-9] <' -e '>'
;;
[1-9]) cd "${DIRHIST[$1]}" ;;
* ) echo "Usage: cdo [NUM|ls]" >&2; return 2 ;;
esac
}
O exemplo a seguir usa um prompt de dólar de diretório hash ( # dir $
), escolhido porque o Stack Overflow deixará os prompts em cinza:
# ~ $ cd /tmp
# /tmp $ cdo
# ~ $ cdo ls
1 </tmp>
# ~ $ cd /
# / $ cdo ls
1 </home/adam> 2 </tmp>
# / $ cdo
# ~ $ cdo ls
1 </> 2 </tmp>
# ~ $ cdo 2
# /tmp $ cd test
# /tmp/test $ cd ../test2
# /tmp/test2 $ cdo ls
1 </tmp/test> 3 </home/adam>
2 </tmp> 4 </>
# /tmp/test2 $ cdo 4
# / $ cd
# ~ $ cdo ls
1 </> 3 </tmp/test>
2 </tmp/test2> 4 </tmp>
É realmente legal ver que outras pessoas tiveram a mesma ideia geral que eu (eu pensei que fosse original!). A menção de @ SamTroliman sobre fastcd , @ null xd , e o j2 do @phildobbin parecem bastante semelhantes. Veja também pergunta duplicada 84445 , que tem uma resposta zsh usando setopt auto_pushd
. Eu ainda prefiro meu próprio código, mas ymmv.
Parece que o que você precisa é basicamente um arquivo de projeto para o seu fluxo de trabalho. Com diretórios que pertencem à sua atividade, como em um IDE de programação. Experimente as Zsh Navigation Tools e a ferramenta n-cd
lá. Ele permitirá que você navegue pelas últimas pastas visitadas e também defina um Hotlist
com os diretórios de sua escolha:
n-cd
podeserassociadoaumacombinaçãodeteclascom:
zle-Nznt-cd-widget
bindkey"^T" znt-cd-widget
Fish
para o shell interativo que o autoriza imediatamente ( fish
> zsh
> bash
). POSIX
/ Bash
para script que é a sintaxe mais amplamente suportada ( POSIX
> Bash
> Zsh
> Fish
). Ter testado diferentes shells aqui é o meu feedback (em ordem de teste / adoção):
Bash
+ Zsh
:
oh-my-zsh
→ cd /e/x1
); cd /etc/X11/
+ Fish
(atual) é o melhor da caixa:
Cada shell pode ser expandido usando oh-my-fish
e function
, aqui estão os que eu uso relacionados ao seu problema (compatível com POSIX):
back () { # go to previous visited directory
cd - || exit
}
up () { # go to parent directory
cd ..|| exit
}
Existem coisas básicas, mas realmente significativas, tão fáceis de lembrar e de autocompletar.
Configure alias
para adicionar seus diretórios mais usados (por exemplo, CDPATH
, ~/projects/
) para que você possa pular rapidamente para eles.
Veja a resposta manatwork para mais detalhes sobre /etc/init.d/
.
Tags command-line bash alias cd-command shell