Je souhaite basculer fréquemment entre des répertoires qui se trouvent dans des chemins totalement indépendants, par exemple /Project/Warnest/docs/
et ~/Dropbox/Projects/ds/test/
.
Mais je ne veux pas taper cd /[full-path]/
tout le temps. Existe-t-il des commandes de raccourci pour basculer vers des répertoires précédemment utilisés?
Une solution à laquelle je pourrais penser est d'ajouter des variables d'environnement à mon bash
.profile
pour les répertoires fréquemment utilisés et cd
pour eux en utilisant ces variables.
Mais y a-t-il une autre solution à cela?
Si vous basculez simplement entre deux répertoires, vous pouvez utiliser cd -
pour aller et venir.
Il existe une variable Shell CDPATH
dans bash
et ksh
et cdpath
dans 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.
Vous pouvez donc définir dans votre ~/.bashrc:
export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds
Alors cd docs
et cd test
vous amènera au premier répertoire de ce type. (Je veux dire, même si un répertoire du même nom existera dans le répertoire courant, CDPATH
sera toujours consulté. Si CDPATH
contiendra plus de répertoires ayant des sous-répertoires avec le nom donné, le premier un sera utilisé.)
Quelque chose d'autre que vous pourriez essayer est un outil appelé autojump . Il conserve une base de données d'appels à son alias (j
par défaut) et tente de prendre des décisions intelligentes sur l'endroit où vous voulez aller. Par exemple, si vous tapez fréquemment:
j ~/Pictures
Vous pouvez utiliser ce qui suit pour y arriver en un rien de temps:
j Pic
Il est disponible pour Debian et Ubuntu et inclus utilisateur par utilisateur dans ~/.bashrc
ou ~/.zshrc
par défaut.
S'il s'agit d'un petit nombre de répertoires, vous pouvez utiliser pushd
pour alterner entre eux:
# 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
contrairement à cd -
, vous pouvez l'utiliser avec plus de deux répertoires
Pour donner suite à la suggestion de Noach, j'utilise maintenant ceci:
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
}
exemple d'utilisation:
# 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
etc. Évidemment, cela ne sert qu'à faire défiler la pile et ne gère pas l'ajout de nouveaux chemins - je devrais peut-être le renommer.
J'utilise alias
dans bashrc pour faire ces CD.
tel que:
alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
J'ai trouvé un script (généralement appelé acd_funch.sh) qui a résolu ce problème pour moi. Avec cela, vous pouvez taper cd --
pour voir les 10 derniers répertoires que vous avez utilisés. Cela ressemblera à ceci:
0 ~/Documents/onedir
1 ~/Music/anotherdir
2 ~/Music/thirddir
3 ~/etc/etc
Aller à ~/Music/thirddir
tapez simplement cd -2
REMARQUE: Ce script a été initialement publié dans un article de la gazette linux qui est disponible ici: acd_func.sh - étend le CD de bash à conserver, afficher et accéder à l'historique des noms de répertoires visités .
Utilisez "pushd - n" (en supposant que vous utilisez bash).
Ajoutez à votre ~/.bashrc:
pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/
puis,
cd ~
est votre maison,
cd ~1
est ~/Dropbox/Projects/ds/test/
cd ~2
est /Project/Warnest/docs/
Vous pouvez utiliser ~1
, ~2
etc exactement de la même manière que ~
.
Essaie le cdable_vars
Option shell dans bash. Vous l'allumez avec shopt -s cdable_vars
.
Ensuite, vous devez définir vos variables export dir1=/some/path
. et enfin cd dir1
, etc. Vous pouvez ensuite le mettre dans votre ~/.bashrc
pour le faire coller.
Il y a beaucoup de bonnes suggestions ici. L'option à utiliser dépendrait de votre choix entre une petite liste fixe de répertoires ou la recherche d'une solution plus générique.
S'il s'agit d'une petite liste fixe, la configuration d'alias simples (comme l'a suggéré Felix Yan) serait plus facile à utiliser.
Si vous recherchez une solution plus généralisée (c'est-à-dire de nombreux répertoires différents, changeant au fil du temps), j'utiliserais pushd et popd (comme suggéré inutile). Personnellement, je trouve que le pushd/popd par défaut est difficile à utiliser, surtout lorsque vous commencez à basculer entre de nombreux dossiers; cependant, j'ai écrit quelques ajustements qui me facilitent la tâche. Ajoutez ce qui suit à votre bashrc:
alias dirs='dirs -v'
pd ()
{
if [ -n "$1" ]; then
pushd "${1/#[0-9]*/+$1}";
else
pushd;
fi > /dev/null
}
pd
(sous la forme abrégée de pushd
) pour accéder à un nouveau dossier, en vous rappelant où vous vous trouviez.dirs
pour voir la liste des répertoires enregistrés.pd 3
pour passer au répertoire numéro 3.Exemple d'utilisation:
$ 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$
Vous pourriez faire pire que d'essayer j2 .
Du README:
Passez beaucoup de temps sur CD-ing autour d'une arborescence de répertoires complexe?
j garde une trace de l'endroit où vous vous êtes rendu et du temps que vous y avez passé et fournit un moyen pratique d'accéder aux répertoires que vous utilisez réellement.
Je l'utilise largement et le recommande.
Les éléments suivants semblent fonctionner sur le seul cas sur lequel je l'ai testé, et vous pouvez simplement déposer vos noms de répertoire sous forme de liens symboliques dans ~/Bookmarks:
mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"
function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }
ccd testdir && echo $PWD
# gives /tmp
D'après mon expérience, la plus grande accélération de la navigation dans un shell est d'utiliser sa fonctionnalité de recherche d'historique. Dans Bash, vous pouvez rechercher en arrière dans votre historique de commandes en appuyant sur Ctrl
+ R
et tapez un modèle. Ce modèle est ensuite comparé aux entrées précédentes de votre historique - qu'il s'agisse de commandes cd
ou d'autres opérations - et des suggestions sont faites lors de la frappe. Appuyez simplement sur Entrée pour exécuter à nouveau la commande suggérée. C'est appelé reverse-search-history
dans Bash et je l'adore. Cela me fait économiser beaucoup de frappes et épargne ma mémoire interne.
C'est une bonne chose car il suffit de se souvenir d'une partie plus petite d'une commande, comme Drop
ou Wa
pour distinguer les deux entrées d'historique cd ~/Dropbox/Projects/ds/test/
et cd /Project/Warnest/docs/
.
J'utilise également ces alias (ajoutez-les à ~/.bashrc):
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
Il est beaucoup plus rapide d'aller avec eux dans le répertoire supérieur (mais cela ne résout que la moitié de la navigation).
Je conseillerais d'utiliser zsh , que Shell est une très bonne complétion TAB pour les répertoires, les fichiers et même les options pour la plupart des programmes cli.
J'utilise ce Shell depuis des années maintenant, et je manquerais la fonctionnalité si elle avait disparu. Le script zsh est aussi très amusant, avec un grand nombre de one-liners qui peuvent vous aider tous les jours.
si vous utilisez zsh:
vous n'avez pas besoin de taper cd
, tapez simplement le chemin du répertoire (/foo/bar/baz<Enter>
est égal à cd /foo/bar/baz<Enter>
)
a besoin auto_cd
option à définir
Tab
(/u/sh/pi<Tab>
se développe en /usr/share/pixmaps
; fonctionne également pour les noms de fichiers)De toute façon, vous ne devriez jamais taper le chemin complet dans Shell. Vous pouvez toujours utiliser:
soffice /P*/W*/*/mydoc*
au lieu de
soffice /Project/Warnest/docs/mydoc.odt
Il existe un outil plutôt sympa pour des changements de répertoire rapides:
xd - Changeur de répertoire rapide eXtra http://xd-home.sourceforge.net/xdman.html
un peu gênant est que vous devez le mapper dans le profil bash ou similaire car il ne produit que le répertoire
# 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 $*`
}
vous pouvez faire des choses comme:
# 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
cdargs est l'outil le plus efficace pour marquer un annuaire: http://www.youtube.com/watch?v=uWB2FIQlzZg
J'avais la même question et j'ai d'abord trouvé cette réponse . J'ai installé l'utilitaire z ( https://github.com/rupa/z ).
C'est exactement ce que vous recherchez, car z apprend de vos commandes cd et garde une trace des répertoires selon le principe frecency (fréquent et récent) . Donc, après avoir fait les deux commandes cd une fois, vous pouvez faire quelque chose comme:
z docs
z ds
sauter à /Project/Warnest/docs/
et ~/Dropbox/Projects/ds/test/
respectivement. Les arguments de z sont des expressions rationnelles, vous n'avez donc même pas besoin de taper un nom de dossier complet.
Mise à jour (2016): J'utilise maintenant FASD pour cela, ce qui autorise le flou recherche basée sur vos derniers répertoires.
J'ai créé un outil pour cela, en Ruby. Il vous permet d'utiliser des fichiers YAML pour déclarer vos projets.
J'ai écrit un petit article à ce sujet ici: http://jrnv.nl/switching-projects-terminal-quickly/
J'ai également publié la source sur GitHub: https://github.com/jeroenvisser101/project-switcher
Il existe également une application "wcd" créée spécialement pour cela (également portée sur cygwin, puisque j'y suis). Vous pouvez créer des raccourcis, des signets de répertoires avec. Prend également en charge les caractères génériques. La lecture de la page de manuel et des documents dans/usr/share/wcd devrait beaucoup aider.
Essayez fastcd ( https://github.com/frazenshtein/fastcd ) Il définit le hook qui enregistre les répertoires visités à partir de bash. Et définit le script comme un "j" alias, qui vous montre les derniers répertoires visités, avec la possibilité de cd rapidement (commencez à taper pour filtrer les répertoires). La modification de .bashrc est requise pour créer l'alias "j".
Obtenir un outil
cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd
Installer les modules requis
pip install --user urwid
Sourcez le fichier set.sh dans votre bashrc
echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc
Et mettre à jour bashrc
source ~/.bashrc
Ensuite, tapez simplement "j" dans la console
Il y a aussi OLDPWD
, une variable d'environnement qui, selon IEEE 1003.1 (POSIX), devrait être mise à jour avec le répertoire de travail précédent à chaque fois que cd
change de répertoire de travail (pour les curieux, ligne 80244 de la page 2506 de l'IEEE 1003.1-2008).
J'utilise mon propre utilitaire cdhist pour gérer cela depuis de nombreuses années. Il alias votre commande cd et conserve automatiquement une pile de répertoires.
Vous pouvez utiliser export
pour affecter vos chemins de répertoire aux variables, puis les référencer.
export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2
anc
est un outil de ligne cmd (abréviation de anchor), qui conserve les signets des répertoires. (jusqu'à présent uniquement testé avec bash)
Dans ton cas:
anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/
cela ajoute les deux répertoires à la liste d'ancrage (pensez aux signets)
maintenant si vous voulez passer à /Project/Warnest/docs/
de n'importe où sur votre type de système:
anc Warn
et si vous voulez passer à ~/Dropbox/Projects/ds/test/
type:
anc ds test
En plus de faire correspondre le texte avec les chemins marqués d'un signet, il existe de nombreuses autres façons pratiques de parcourir les répertoires.
anc i
démarre le mode interactif, qui répertorie tous les signets par numéro, donc tout ce que vous avez à taper est le numéro
Si vous tapez:
anc Pro[TAB]
une liste correspondant à tous les signets (dans votre cas, les deux signets) s'affiche et vous pouvez la sélectionner à l'aide de vos touches fléchées, c'est une manière très rapide et intuitive.
Obtenez anc sur la page github du projet: https://github.com/tobimensch/anc
Il y a aussi un README avec un exemple d'utilisation.
Divulgation complète: je suis l'auteur de ce script. J'espère que certaines personnes le trouveront utile.
Je n'ai jamais aimé pushd
et popd
car ils nécessitent de la prévoyance. Vissez cela, nous allons simplement garder une trace des derniers répertoires par nous-mêmes et les rendre disponibles avec une fonction cd-to-old-dirs. Je l'appelle cdo
. Mettez-le dans votre fichier rc (par exemple ~/.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
ls ) for d in "${DIRHIST[@]}"; do echo "$((n=n+1)) <$d>"; done \
|sed "s:<$HOME:<~:;s:</home/:<~:" |column \
|GREP_COLORS='ms=0;32' grep --color -e '\b[0-9] <' -e '>' ;;
[1-9]) cd "${DIRHIST[$1]}" ;;
* ) [ -d "$1" ] && cd "$1" || echo "Usage: cdo [NUM|ls]" >&2; return 2 ;;
esac
}
L'exemple suivant utilise une invite de répertoire de hachage dollar (# dir $
), choisi parce que Stack Overflow rendra les invites grises:
# ~ $ 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>
C'est vraiment chouette de voir que d'autres personnes ont eu la même idée générale que moi (je pensais avoir été original!). La mention de @ (Samtroliman) de fastcd , de @ null's xd et de @ phildobbin j2 sont toutes assez similaires. Voir aussi question en double 84445 , qui a une réponse zsh utilisant setopt auto_pushd
. Je préfère toujours mon propre code, mais ymmv.
Il semble que ce dont vous avez besoin soit essentiellement un fichier de projet pour votre flux de travail. Avec des répertoires qui appartiennent à votre activité, comme dans un IDE de programmation. Essayez Zsh Navigation Tools et l'outil n-cd
Là. Il vous permettra de parcourir les derniers dossiers visités et de définir également un Hotlist
avec les répertoires de votre choix:
n-cd
peut être lié à une combinaison de touches avec:
zle -N znt-cd-widget
bindkey "^ T" znt-cd-widget
La solution que j'utilise pour cette situation est screen
. Écran de démarrage et créez une fenêtre pour chaque répertoire avec C-a c
et y naviguer. Basculer entre les fenêtres/répertoires avec C-a n
ou C-a p
. Nommez les fenêtres avec C-a A
. Ensuite, vous pouvez afficher une liste de vos fenêtres avec C-a "
et naviguez en utilisant le numéro ou le nom de la fenêtre. Puisqu'il s'agit de screen
, vous pouvez vous détacher de la session en sauvegardant votre espace de travail et le rattacher plus tard avec la même configuration.
Fish
pour le shell interactif qui vous permet immédiatement (fish
> zsh
> bash
).POSIX
/Bash
pour les scripts qui est la syntaxe la plus largement prise en charge (POSIX
> Bash
> Zsh
> Fish
).Après avoir testé différents shells, voici mes commentaires (par ordre de test/adoption):
Bash
: Zsh
+ oh-my-zsh
: cd /e/x1
→ cd /etc/X11/
);Fish
+ oh-my-fish
(actuel) est le meilleur de la boîte: Chaque Shell peut être développé en utilisant function
et alias
, voici ceux que j'utilise en rapport avec votre problème (compatible POSIX):
back () { # go to previous visited directory
cd - || exit
}
up () { # go to parent directory
cd ..|| exit
}
Il existe des bases, mais vraiment significatives, faciles à mémoriser et à compléter automatiquement.
Configurez CDPATH
pour ajouter vos répertoires les plus utilisés (par exemple ~/projects/
, /etc/init.d/
) pour pouvoir y accéder rapidement.
Voir réponse manatwork pour plus de détails sur CDPATH
.
Quelques suggestions ici:
Idée la plus directe, j'ajouterai un alias dans le fichier .profile
vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'
Utilisez ensuite $ dir1
ou dir2
, peut cd
Si vous changez toujours en deux dir. en utilisant cd -
basculera entre eux.
J'ai écrit un script juste pour ça. Voici le lien vers Github .
Voici un exemple d'utilisation:
Ajoutons d'abord une variable pev:
$ pev add longpath '/A/very/very/long/path/I/frequently/need' # output: # environment variable "pev_longpath" added successfully. "pev show" to see the list of pev variables.
Voyons maintenant une liste de variables pev définies jusqu'à présent:
$ pev show # output: | NAMES VALUES | ---------- ---------- | pev_longpath "/A/very/very/long/path/I/frequently/need"
Ensuite, changez-le en répertoire:
$ cd $pev_longpath
ou copiez quelque chose dans l'un de ses sous-répertoires:
$ cp somefile $pev_longpath/and/deeper/than/that
En fait, les variables pev ne sont pas différentes des autres variables d'environnement, elles sont probablement plus faciles à gérer. N'hésitez pas à me signaler mes erreurs car je n'ai pas beaucoup d'expérience avec les scripts Shell. HTH.
Sur la base de vos critères, je pense simplement définir un alias
pour chaque chemin fréquemment utilisé dans votre ~/.bashrc
est la voie à suivre. J'utilise cette méthode personnellement.
alias taxes='cd /users/bob/documents/home/finances/taxes'
alias elvis='cd /dropbox/2016/files/music/elvis'
Comme je l'ai mentionné pour une question connexe ( link ), si vous avez parcouru l'arborescence des répertoires et que vous souhaitez remonter, ..
est mon préféré. Vous pouvez vous déplacer assez facilement dans une branche de l'arborescence avec .. en remontant un répertoire et ../..
deux et ../../..
trois, etc. Vous pouvez également monter et descendre une branche différente avec la même commande, comme cd ../../example
ou cd ../../../example/example
etc. Pour un simple commutateur qui va et vient entre les répertoires, cd -
ou $OLDPWD
sont vos meilleurs paris.
De loin, la meilleure solution pour une navigation rapide dans les répertoires dans les terminaux bash et zsh est d'installer le script z - jump around . Ce script incontournable a été recommandé par Google Chrome Devtools, Paul Irish, dans son 2013 Fluent keynote . Je ne peux pas vivre sans.
DESCRIPTION Suit vos répertoires les plus utilisés, en fonction de la "fréquence".
Après une courte phase d'apprentissage, z vous amènera dans le répertoire le plus "frecent" qui correspond à TOUTES les expressions rationnelles données sur la ligne de commande, dans l'ordre.
Par exemple,
z foo bar
correspondrait à/foo/bar mais pas/bar/foo.[...]
Frecency est un portemanteau de "récent" et de "fréquence".
le répertoire de travail (wd) d'Atomic semble être un bon paquet pour cela: https://github.com/karlin/working-directory
J'ai implémenté 2 fonctions bash:
cdh (historique des cd): il se souvient automatiquement des 9 derniers répertoires et vous pouvez revenir à l'un d'eux en entrant le numéro.
cdb (signets cd): vous pouvez affecter n'importe quel caractère au répertoire en cours et accéder ultérieurement à ce répertoire en saisissant ce caractère.
cdh et cdb fonctionnent tous les deux avec autocd (alias "cd sans cd").