cd en tapant simplement le nom du répertoire?


58

J'avais cela quelque part il y a 20 ans ou j'en rêvais.

Fondamentalement:

Si si blobblobje reçois
blobblob: command not found

C'est suffisant.

Je voudrais que, lorsque mon shell récupère ces erreurs - commande non trouvée -, il vérifie s’il existe un répertoire portant ce nom ("blobblob") et, le cas échéant, qu’il se trouve cddans ce répertoire.

Je suis sûr qu'il y a des raisons de ne pas faire ceci ou de le faire avec prudence.
Je pense juste que ce serait plutôt chouette et je voudrais essayer en trouvant quelque part (comme ici!).

Je ne sais pas comment faire le même genre de programmation shell.

Réponses:


76
  • Frapper: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

En outre, "autojump" est un outil utile. Une fois installé, il mémorise les répertoires pour que vous puissiez taper j abc et si vous avez déjà visité abc, dites x / d / f / g / t / abc, il sera ensuite enregistré!
https://github.com/joelthelion/autojump


1
Ouais j'ai tapé shopt -s autocdà la ligne de commande à cela a fonctionné. Maintenant, je peux juste commencer à taper les noms de répertoires et utiliser la saisie semi-automatique, puis appuyer sur Entrée et sur le shell cddans le répertoire. Trop cool !
Michael Durrant

6
Génial. Merci de signaler un dysfonctionnement à éviter.
vonbrand

3
Je n'utilise pas ceci - ce cdn'est pas si difficile à taper, et la plupart des mécanismes de complétion par des onglets sont plus intelligents lorsque vous leur donnez plus de contexte.
jw013

Après avoir annulé une exclamation excessive d'appréciation, permettez-moi de dire qu'autodd est la bonne réponse: D
Luc

Le autocdshopt a été ajouté à la version 4 de bash. Il n’est donc pas disponible sur macOS (qui a toujours la version 3.xx de bash) à moins qu’un autre bash, plus récent, soit installé (par exemple, via homebrew).
Quinn Comendant

2

L' utilitaire autojump fournit un mécanisme similaire avec une liste de répertoires les plus utilisés. Cela nécessite toutefois l’ennui supplémentaire du typage, jSpacemais cela est compensé par des suppositions exactes le plus souvent.

C'est le plus proche de DWIM que j'ai utilisé à ce jour.


1

Une fois, j’ai réalisé un script utile dans un but similaire, avec une fonction fcd pour find-n-cd.

Vous tapez fcd fooet 3 choses peuvent arriver:

  • Un tel répertoire n'est pas trouvé, alors il retourne avec "no such directory " $1
  • Un fichier est trouvé: il vérifie s'il s'agit d'un répertoire (ou simplement d'un fichier) et, le cas échéant, il y est stocké.
  • Plusieurs fichiers sont trouvés - puis une sélection est présentée, où vous tapez simplement le numéro de la sélection (ou un numéro spécial pour le retour).

Il est similaire en ce sens que vous n'avez pas besoin de taper le chemin complet, mais vous devez appeler la fonction explicitement.

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

Vous devez utiliser sourcela fonction ( source fcd.sh| . fcd.sh) et ne pouvez pas l'appeler en tant que script, car cdsinon, cela ne se produirait que dans le contexte du script. Une fois l'opération terminée, vous vous retrouveriez immédiatement dans votre répertoire de départ.

Comme cela fonctionne avec locate, il est assez rapide de trouver des répertoires (mais pas toujours à jour).

Il ne gère pas les espaces dans les noms de répertoire avec élégance. Si vous avez une solution élégante au problème, je serais heureux.


1
La question était de cdautomatiquement, sans taper de commande. Cette réponse convient mieux à la navigation rapide dans le terminal .
manatwork

2
@manatwork: Eh bien, vous pouvez combiner la commande avec le gestionnaire d'erreurs de bash. Dans /etc/bash.bashrcubuntu, il y en a un function command_not_found_handlequi semble pouvoir être modifié.
utilisateur inconnu

Je t'ai eu. Cela sonne beaucoup mieux.
manatwork

@manatwork: Je le ferais moi-même, si je voulais l'utiliser moi-même. Mais si je veux changer de répertoire, j'aime utiliser une commande courte, mais si je me trompe avec quelque chose, j'oublie rarement de taper 3 ou 4 caractères. Avoir ce programme en place me serait plutôt agaçant, mais l’utiliser explicitement, c’est bien.
Utilisateur inconnu

1

Cela fonctionne aussi,

cdf name_of_file_or_directory

..donné que vous avez configuré un script personnalisé cdf.sh (ci-dessous) provenant du shell. Pour un répertoire en tant que paramètre, ce script n'entre que dans le répertoire parent du répertoire trouvé. Ajouter la ligne suivante dans votre .bashrc ou .zshrc, peu importe ..

source ~/bin/cdf.sh 

Et ajoutez ce code dans le fichier ~ / bin / cdf.sh que vous devez créer à partir de zéro.

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}

Excellente réponse à une vieille question. Je pense que vous recevrez un badge pour avoir relancé une vieille question. Bienvenue à U & L.SE
eyoung100

0

Mettez ceci dans votre ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.