«Signets» pour bash

24

La navigation sur plusieurs couches de répertoires imbriqués est souvent un problème. Sur Firefox, c'est facile car ils ont des signets. Donc, ce que je voudrais faire pour mettre un fichier en signet, c'est taper:

$ go --add classes "repo/www/public/util/classes"

Ensuite, pour accéder à ce répertoire, je taperais:

$ go classes

Auparavant, j'ai utilisé des liens symboliques pour obtenir quelque chose de similaire, mais je ne veux pas encombrer mon répertoire personnel. Il existe de nombreuses autres fonctionnalités qui pourraient s'avérer utiles. Par exemple, je voudrais pouvoir commencer à taper go clpuis appuyer sur tab pour la saisie semi-automatique. Parfois, plusieurs copies d'un référentiel sont extraites et il serait donc utile que le programme me permette de créer plusieurs contextes et de définir le signet par rapport au répertoire de base du contexte.

Donc, avant de commencer à bricoler mon propre ensemble de scripts, y a-t-il déjà quelque chose comme ça?

Casebash
la source
4
Si vous continuez à comparer bash à firefox, quelqu'un fera une barre impressionnante pour bash :(
hhaamu

Réponses:

12

Je cherchais depuis trop longtemps un outil de bookmarking shell et je ne suis satisfait d'aucune des solutions que j'ai trouvées.

Cependant, j'ai finalement trouvé un excellent outil universel: le chercheur flou en ligne de commande .

Il vous permet principalement de «trouver floue» des fichiers (vérifiez l'animation gif riche par le lien ci-dessus), mais il permet également de lui fournir des données textuelles arbitraires et de filtrer ces données. Donc, l'idée des raccourcis est simple: tout ce dont nous avons besoin est de maintenir un fichier avec des chemins (qui sont des raccourcis), et de filtrer flou ce fichier. Voici à quoi cela ressemble: nous tapons la cdgcommande (à partir de "cd global", si vous le souhaitez), obtenez une liste de nos signets, choisissez celui qui vous convient en quelques touches et appuyez sur Entrée. Le répertoire de travail est remplacé par l'élément sélectionné:

cdg

C'est extrêmement rapide et pratique: en général, je tape juste 3-4 lettres de l'élément nécessaire, et toutes les autres sont déjà filtrées. De plus, bien sûr, nous pouvons parcourir la liste avec les touches fléchées ou avec Ctrl+j/ Ctrl+k.

Un article détaillé sur cette solution de raccourcis / signets est ici: Raccourcis flous pour votre shell .

Dmitry Frank
la source
19

Je pense que vous cherchez quelque chose comme le saut automatique . Vous devez tourner un peu autour pour développer un ensemble de "poids clés" qui correspondent à la quantité de temps passé dans un répertoire donné. Ensuite, en supposant que vous ayez passé beaucoup de temps dans ce répertoire «classes», vous pouvez y accéder directement en tapant

j cl

Vous pouvez voir vos "poids clés" avec

jumpstat
tcdyl
la source
J'ai récemment trouvé un outil un peu plus complexe, mais intéressant et connexe appelé f: github.com/clvv/f
tcdyl
14

Comme le mentionne saeedn, les alias sont un bon mécanisme. Le shell bash dispose également d' un mécanisme intégré pour sauter à droite à un endroit: CDPATH. Réglez-le comme PATH, mais il est utilisé par cdau lieu de rechercher des programmes.

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

Depuis la page de manuel:

   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.   A  sample  value  is
          ".:~:/usr".

Moi-même, j'ai combiné cela avec un répertoire qui a des liens symboliques vers où je voudrais aller:

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

Cela présente l'inconvénient que le répertoire ne semble pas tout à fait correct, mais cela peut être corrigé en utilisant cd -Pou en définissant set -P.

Arcege
la source
CDPATH est intéressant, mais cela vaut probablement la peine d'utiliser une commande go distincte pour que le comportement soit toujours prévisible
Casebash
1
+1 pour l'ensemble -P. Certains de mes liens symboliques me rendaient fou parce que je ne pouvais pas me rappeler où ils étaient vraiment allés et je ne me souvenais pas de la commande qui montre ces informations.
Joe
@Joe, j'ajouterais alias C='cd -P .'plutôt que set -P, car pour les liens symboliques système, cela ne me dérange pas d'être dans le répertoire des liens symboliques.
Wildcard
@Wildcard - intéressant - pourriez-vous donner un exemple où cela fait une différence pour vous? Je viens de courir help cdet je ne comprends toujours pas ce que fait l'option -P.
Joe
@Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Wildcard
9

Vous pouvez combiner l'historique existant de Bash et les fonctionnalités de recherche d'historique. Appuyez sur Ctrl-Rpour commencer la recherche inversée incrémentielle, puis commencez à taper la partie du chemin le plus susceptible d'être unique.

Vous pouvez continuer à taper des lettres jusqu'à ce que vous reveniez à la cdcommande la plus récente impliquant ce répertoire, ou vous pouvez appuyer à Ctrl-Rnouveau pour revenir en arrière dans l'historique à la prochaine commande la plus récente correspondant à ce que vous avez tapé jusqu'à présent.

Je fais ça tout le temps.

En fait, je vais encore plus loin. Une fois que je commence à découvrir des séquences de commandes utile de garder dans l' histoire , mais ne vaut pas engager dans un script shell, je commence à les enchaîner avec &&et ;combinateurs donc je peux inverse rechercher une sous - chaîne de que l' on commande long, frappé Enteret exécuter la séquence entière à une fois que.

Par exemple, voici comment je crée et exécute l'un de mes programmes pendant le développement:

$ ( cd .. ; make install ) && ./start_my_program

Je le fais à partir du répertoire d'installation, qui se trouve sous le répertoire source de niveau supérieur. En enveloppant la partie cd, construire et installer dans un sous-shell, je m'assure que peu importe ce qui se passe au cours de ce processus, je me retrouve dans mon shell normal sans rien changer. Ce n'est que si cela réussit (&&) que je démarre le programme construit et installé. Je peux trouver cela dans mon histoire avec juste un Ctrl-Rmoment sta, c'est tout ce dont j'ai habituellement besoin pour trouver uniquement cette séquence de commandes.

Un autre exemple de la façon dont j'utilise ceci est la séquence qui va dans la construction de RPM pour ce même programme. La plupart du travail fastidieux se fait dans des scripts shell, mais il y a encore quelques commandes que je devrais normalement taper pour faire tout le travail de construction et de déploiement des RPM construits, que j'ai maintenant rarement à retaper, car Bash continue dans l'histoire pour moi.

Combinez tout cela avec export HISTSIZE=bignumet shopt histappendet vous venez de créer une mémoire de commande éléphantine.

Une autre solution que j'ai codée une fois est dans ma réponse à une autre question ici . Il peut être nécessaire de l'adapter à vos besoins et il ne gère que les cdcommandes, tandis que l'option de recherche d'historique fonctionne partout et pour chaque commande.

Warren Young
la source
6

J'utilise moi-même aliaspour raccourcir les longs chemins que je visite souvent. Vous pouvez mettre votre ensemble d' aliases dans votre bashrc, afin que bash puisse s'en souvenir à chaque connexion. Et heureusement, bash ajoute des alias à la saisie semi-automatique.

J'écrirais quelque chose comme ceci pour votre cas: alias go-classes="cd ~/repo/www/public/util/classes"

saeedn
la source
6

Vous cherchez peut-être des bashmarks (sur github).
Du README:

Bashmarks est un script shell qui vous permet d'enregistrer et d'accéder aux répertoires couramment utilisés. Prend désormais en charge la complétion des onglets.

Giuseppe Rota
la source
4

Ce n'est en aucun cas complet ni infaillible, juste un brouillon pour commencer. En ajoutant ce qui suit dans votre, ~/.bashrcvous aurez trois commandes pour ajouter des signets de répertoire de suppression et de liste (qui sont basés sur des alias de shell, de sorte que vous obteniez également une auto-complétion).

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

L'utilisation est assez simple. bmaddavec un argument ajoute un alias nommé d'après l'argument. Cet alias crée simplement un cd dans le répertoire dans lequel il a été défini. Sans argument, il utilise le nom de répertoire actuel comme nom d'alias. De la même manière, bmdelsupprime un alias s'il existe et bmlistrépertorie les signets actuels.

par exemple

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $
forcefsck
la source
4

J'ai rencontré le même besoin il y a un moment et j'ai décidé de rassembler quelques scripts pour m'aider à mettre en signet des chemins absolus / relatifs et à les mapper à des noms plus courts dont je me souviens facilement.

Le script est très facile à utiliser et il créera simplement une fonction avec le nom court que vous fournissez en tant qu'alias au répertoire dans lequel vous souhaitez accéder. Tout ce que vous devez faire est simplement de taper ce nom court et il vous dirigera vers le répertoire marqué.

Voici un lien vers la source du script de signet. Au fait, je l'ai nommé le Bookmarker.

Usage

Une fois installé, il est assez simple à utiliser.

Pour marquer un répertoire:

$ mark /this/is/a/very/very/looooong/path mydir

Pour naviguer vers un répertoire marqué:

$ mydir

Pour voir ce qui a été marqué:

$ marks
bin     -> /Users/khafaji/bin
eBooks  -> /Users/khafaji/eBooks

Pour supprimer un répertoire marqué:

$ umark myDir

Pour d'autres exemples, instructions d'installation, etc., voir la documentation très détaillée .

Hass Joseph K.
la source
3

cdargs est le meilleur outil pour le bookmarking d'annuaire.

Pour des exemples d'utilisation, consultez les signets de la vidéo de commande cd sur YouTube.

Exemple d'utilisation

cdargsest une interface graphique ncurses qui vous permet de naviguer visuellement dans votre shell. Une fois installé, vous le configurez dans un shell donné en vous procurant un script shell:

$ source /etc/profile.d/cdargs.sh

Cela active plusieurs fonctions que vous pouvez ensuite appeler depuis votre shell.

Invoquez l'interface graphique:

$ cv

Il en résulte ce type d'interface graphique:

   [.       ]  /home/saml/tst/88040
 0 [path0   ]  /home/saml/tst/88040/path0
 1 [path1   ]  /home/saml/tst/88040/path1
 2 [path2   ]  /home/saml/tst/88040/path2

Vous pouvez utiliser vos touches fléchées pour vous déplacer vers le haut et vers le bas pour parcourir la liste. La flèche gauche ( ) monte d'un niveau dans l'arborescence des répertoires, une flèche droite ( ) descend dans un répertoire.

marquage des répertoires:

Vous pouvez soit utiliser cpour le répertoire en cours de navigation, soit aajouter le répertoire que vous mettez actuellement en surbrillance avec le curseur.

modes de fonctionnement:

cdargsest un peu comme vi / vim à cet égard où il a cette notion de modes . Il y en a 2, la navigation (B) et la liste (L). Vous pouvez voir dans quel mode vous êtes grâce à l'affichage au bas de votre coque.

Mode de référencement:

L: /home/saml/tst/88038

Mode de navigation:

B: /home/saml/tst/88038

Vous pouvez modifier votre mode en appuyant sur la touche de tabulation ( TAB).

Ceci n'est que la pointe de l'iceberg, consultez la page de manuel ( man cdargs) ainsi que l'aide intégrée pour plus d'informations.

Emon
la source
2

Le meilleur outil pour cela est: wcd . J'ai testé de nombreux autres outils, et celui-ci est utilisé exactement comme vous le demandez et il est meilleur à bien des égards que toutes les solutions précédentes.

Daniel Fanjul
la source
1

Les autres réponses sont excellentes et spécifiques. Une autre façon de voir les choses est d'utiliser un macro processeur de clavier qui peut faire presque tout ce que vous pouvez imaginer.

Découvrez AutoKey. Il peut remplacer des phrases comme une correction automatique de traitement de texte ou un historique bash et il peut également exécuter un script python sur une touche de raccourci que vous définissez qui peut faire presque n'importe quoi et également envoyer des touches à votre périphérique d'entrée de caractères - tout comme si vous les aviez saisies.

Le seul "défaut" qu'il a (par rapport à cette question) est qu'il a besoin d'un gui pour fonctionner dans - gnome ou kde. Les autres réponses n'ont pas cette exigence.

https://code.google.com/p/autokey/
Joe
la source
1

Il existe une autre alternative appelée z .

Il apprend à chaque changement de répertoire:

$ cd /tmp/
$ pwd
/tmp
$ cd
$ pwd
/home/user

Ensuite, vous pouvez passer à ce répertoire plus tard avec une correspondance floue:

$ z mp
$ pwd
/tmp
KARASZI István
la source
1

Apparix est un autre outil qui fait cela. L'une de ses fonctionnalités utiles est que vous pouvez accéder directement aux sous-répertoires de la marque et compléter les tabulations de ces sous-répertoires.

micans
la source
0

Une autre solution qui, je crois, est autojumpet zest fasd.

Il garde une trace des répertoires que vous visitez et z dir-namechangera pour le répertoire avec le nom dir-nameque vous utilisez le plus fréquemment. Il dispose également de certaines fonctionnalités pour les fichiers fréquemment utilisés.

Vous pouvez le cloner à partir de: https://github.com/clvv/fasd

L'installation est simple, clonez, effectuez l'installation, puis modifiez votre .bashrc(ou .zshrcetc.).

Jonathan
la source
0

Vous devez ajouter un alias à votre .bashrc ou .bash_profile.

## navigate to your home directory
$ cd ~
## list the contents of your home directory to see if you have `.bashrc` or `.bash_profile`
$ ls -a 
[`.bashrc` or `.bash_profile` should appear in the list]
## launch the text editor of your choice; I'll use vim here
## if no `~/.bashrc` or `~/.bash_profile`...
$ vim
## if, e.g., `~/.bash_profile` listed...
$ vim ~/.bash_profile

Maintenant, disons que vous voulez un raccourci vers ~/Desktop/Coding/Projects pour appeler ce que vous saisirez goto_Projs. Vous devez ajouter la ligne suivante au fichier ouvert dans l'éditeur de texte:

alias goto_Projs='cd ~/Desktop/Coding/Projects'

Maintenant, faites tout ce que votre éditeur de texte veut que vous fassiez pour /User/<yourusername>/ ou ~/bien sûr) et quitter, et lorsque l'invite du shell est retournée, allez

source ~/.bash_profile

Votre alias devrait maintenant être disponible pour être invoqué comme décrit ci-dessus.

Nathan P. Keene
la source
0

J'utilise la méthode pour ajouter un commentaire à la fin de la commande puis invoquer ctrl R pour inverser la recherche du commentaire. Cela présente les avantages suivants:

  • rechercher une commande en langage naturel
  • changer le commentaire à tout moment à la volée et obtenir la dernière mise à jour de ctrl R
  • utilisation ctrl R et tabà la volée pour apporter des modifications mineures à la commande elle-même, faisant ainsi du commentaire une sorte de raccourci générique vers une famille de commandes similaires
  • aucune configuration, installation ou tenue de livres requise :-)
erav
la source