web-dev-qa-db-fra.com

Avons-nous plus d'histoire pour CD?

cd - peut passer au dernier répertoire visité. Pouvons-nous visiter plus d'histoire autre que le dernier?

45
Tim

La commande que vous recherchez est pushd et popd.

Vous pouvez afficher un exemple de travail pratique de pushd et popd de ici .

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

cd /tmp/dir1
pushd .

cd /tmp/dir2
pushd .

cd /tmp/dir3
pushd .

cd /tmp/dir4
pushd .

dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1
32
Ramesh

Vous n'avez pas spécifié quel shell vous utilisez, alors laissez-le excuser pour annoncer ZSH.

Oui, nous avons plus d'histoire pour cd, à savoir cd -2, cd -4, etc. Très pratique est cd -TAB, en particulier avec le système d'achèvement et les couleurs activées:

C'est ce que j'ai dans .zshrc:

setopt AUTO_PUSHD                  # pushes the old directory onto the stack
setopt PUSHD_MINUS                 # exchange the meanings of '+' and '-'
setopt CDABLE_VARS                 # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit   # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'

Et le résultat:

enter image description here

57
jimmij

Répondre à votre question concernant "plus d'histoire". Non le cd - Fonctionnalité de Bash ne prend en charge qu'un seul répertoire que vous pouvez "retourner" à nouveau à. Comme @Ramesh stipule dans sa réponse. Si vous voulez une histoire plus longue de répertoires, vous pouvez utiliser pushd et popd pour enregistrer un répertoire ou revenir à un précédent.

Vous pouvez également voir la liste de ce qui est actuellement dans la pile avec la commande dirs.

Une explication détaillée peut être trouvée à partir de cette réponse intitulée: Comment utiliser des commandes Poussée et POPD? .

13
slm

Vous pouvez installer et utiliser mon Dirhistory utilitaire pour bash.

Fondamentalement, c'est un démon qui collecte les modifications de répertoire de toutes vos coquilles et un programme CDK qui affiche l'historique et vous permet de choisir n'importe quel répertoire pour passer à (donc vous n'êtes pas limité à une pile).

8
cjm

Le script ACD_FUNC.SH Ce que vous décrivez exactement. Essentiellement elle surcharge la fonction cd et vous permet de taper cd -- Pour obtenir une liste de répertoires précédemment visités, à partir duquel vous pouvez sélectionner le numéro. Je trouve très difficile d'utiliser Bash sans que ce soit, et sa première chose que j'installe sur un nouveau système.

4
Nick Edwards

D'autres ont déjà couvert certaines solutions intéressantes. Il y a quelque temps, j'ai créé ma propre solution à un problème connexe qui pourrait être rapidement modifié pour faire "Histoire directe". Je voulais fondamentalement "étiqueter" quelques répertoires couramment utilisés et recherchés tous Open shells pour les voir, et pour eux de persister entre les redémarrages.

#dir_labels
#functions to load and retrieve list of dir aliases

function goto_complete {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    local cur possib
    cur="${COMP_WORDS[COMP_CWORD]}"
    possib="${!dir_labels[@]}"
    COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}

complete -F goto_complete goto

function goto {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    key="$1"
    else
    key=default
    fi
    target="${dir_labels[$key]}"
    if [ -d "$target" ]; then
    cd "$target"
    echo "goto $key: '$target'"
    else
    echo "directory '$target' does not exist"
    fi
}

function label {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    target="$1"
    else
    target="default"
    fi
    dir_labels["$target"]=$PWD
    for i in "${!dir_labels[@]}"; do
    echo "$i ${dir_labels[$i]}"
    done > ~/.dir_labels
}

Fondamentalement je ferais juste label foo Pour appeler le répertoire actuel foo, puis à partir de n'importe quelle coquille, goto foo Whould cd directement là. Argument vide: label créerait une cible par défaut pour goto.

Je n'ai pas dérangé la mise en œuvre de la suppression automatisée des alias, mais sinon, je l'utilise toujours sous une forme légèrement modifiée.

3
orion

Vous pouvez utiliser ma fonction "Historique de CD" de http://fex.belwue.de/fstools/bash.html

Il se souvient de chaque répertoire où vous avez été et avec "CDH", vous verrez une liste des 9 derniers annuaires. Il suffit d'entrer le numéro et vous êtes de retour dans ce répertoire.

Exemple:

[.____] Framstag @ WUPP: /: cDH[. ____] 1: /USR/Local/bin
2: /var
3: /
4: /tmp/135_pana/1280[.]5: /tmp/135_pana
6: /tmp/weihnachtsfeier
7: /tmp []8: /Local/home/framstag
Select: 4[.____] Framstag @ WUPP:/TMP/135_PANA/1280: 

cDH fonctionne avec Autocd AKA "CD sans CD": vous n'avez pas à taper CD ou BRUPD.

2
Framstag

Voir la fonction CDH dans "Shell Programming, 4e" à la page 312. Il garde l'historique dans un tableau.

Voici une version plus avancée: https://drive.google.com/open?id=0b4f-lr6inxqwq1ppvpuq3fsz2m

Il stocke l'historique dans le fichier CDHistFile et permet de passer au répertoire le plus récent contenant une chaîne, par exemple.

cd -src

Il s'installe sur la commande CD existante en effectuant un alias cd=_cd

1
user2251295

Je voulais juste ajouter marques FZF comme solution possible.

Une fois installé, cela vous donne les commandes Mark et saut pour ajouter et rechercher Pour les répertoires favorables (oui, ce n'est pas exactement l'historique complet, seuls ceux que vous avez bookmarked vous-même).

Le problème que j'ai avec un comportement spécifique à la session Poussad/POPD. J'aimerais avoir la même pile sur une session de bash différente ou donc possible pour les marques FZF.

1
Sebastian Müller

J'ai essayé la réponse @Mikeserv donné, mais cela ne fonctionnait pas vraiment pour moi. Je ne pouvais pas comprendre comment le réparer, alors je viens d'écrire le mien:

cd() {
    # Set the current directory to the 0th history item
    cd_history[0]=$PWD
    if [[ $1 == -h ]]; then
        for i in ${!cd_history[@]}; do
            echo $i: "${cd_history[$i]}"
        done
        return
    Elif [[ $1 =~ ^-[0-9]+ ]]; then
        builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
        return 
    else
        builtin cd "$@" || return # Bail if cd fails
    fi
    # cd_history = ["", $OLDPWD, cd_history[1:]]
    cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}

Ceci est également disponible en tant que GITUB GIST . Pour l'utiliser, il suffit de coller la fonction dans votre .bashrc ou similaire, et vous pourrez faire des choses comme cd -5 Pour revenir à la 5e Direction de la publication de dernier. cd -h vous donnera un aperçu de votre histoire.

1
saagarjha