¿Hay un historial de directorio para bash?

26

¿Hay algo como el historial de búsqueda inversa de bash (Ctrl-r), pero solo para directorios?

Tengo algunas jerarquías de carpetas profundas a las que quiero saltar, por lo que me gustaría usar algo como el historial de búsqueda inversa, pero solo busca nombres de carpetas y me da rutas absolutas.

Esencialmente, daría resultados similares al uso, !?pero solo los comandos coincidentes con cd en el frente, puede recorrer los resultados y las rutas completas.

Hasta ahora, la mejor solución que he encontrado es bashmarks .

idbrii
fuente
1
Recientemente comencé a usar z y eso parece funcionar hasta ahora, pero lo usé para algunas rutas.
Rob

Respuestas:

11

Echa un vistazo a autojump :

Uno de los comandos de shell más utilizados es "cd". ¡Una encuesta rápida entre mis amigos reveló que entre el 10 y el 20% de todos los comandos que escriben son en realidad comandos de CD! Desafortunadamente, saltar de una parte de su sistema a otra con cd requiere que ingrese casi la ruta completa, lo cual no es muy práctico y requiere muchas pulsaciones de teclas.

Autojump es una forma más rápida de navegar por su sistema de archivos. Funciona manteniendo una base de datos de los directorios que más usa desde la línea de comandos. El comando jumpstat le muestra el contenido actual de la base de datos. Debe trabajar un poco antes de que la base de datos sea utilizable. Una vez que su base de datos esté razonablemente completa, puede "saltar" a un directorio ed "cd" comúnmente escribiendo:
j dirspec

Graham
fuente
Puede llevar a problemas con el título de Terminal .
Daniel Beck
6

Ahi esta

cd -

ese es el comando "cd [espacio] [guión]", que va al directorio que estaba antes, esencialmente un "historial de profundidad 1". "Cd -" repetido alterna entre dos directorios.

Citando la página man:

Se admitirán los siguientes operandos: [...]

Cuando se utiliza un [guión] como operando, esto será equivalente al comando:

      cd "$OLDPWD" && pwd

Desafortunadamente, no conozco un historial real de directorios incorporado.

apurkrt
fuente
Hay un pushd dir popdpar que puede almacenar su pila de directorios de historial. Esto es realmente útil en scripts que operan en diferentes carpetas.
Jakuje
Sé de pushdy popd, y también ya se menciona aquí.
apurkrt
3

bash tiene pushd / popd / dirs. Tengo esto en mi .bashrc para insertar automáticamente directorios en la pila de bash.

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

Pop estos usando popdy mostrar la pila usandodirs

usuario3131651
fuente
2

He tenido una buena experiencia con z-jump. Permite completarlo, aunque solo para el destino final, sin pasar por un camino. Sin embargo, muestra la ruta completa al completar la pestaña.

ovid
fuente
1

Solo para intervenir con mi propia experiencia, escribí un script simple para abordar este requisito hace algún tiempo, anula el comando cd incorporado con una función simple que agrega la nueva ubicación del directorio a un archivo de historial, luego se usa un script python para proporciona una interfaz bash que actualiza dinámicamente una lista ordenada de directorios a medida que ingresa los términos de búsqueda, algo así como el comando de búsqueda inversa de bash.

Está disponible en git-hub para aquellos que son curiosos.

Gearoid Murphy
fuente
rock on gearoid
Darth
1

Me gustaría recomendar mi ltcdpara una navegación rápida por el historial del directorio:

https://github.com/dczhu/ltcd

cd demo gif

Proporciona las siguientes características para facilitarle la vida:

  • Listado global de directorios, que muestra los directorios visitados recientemente desde todas las pestañas / ventanas de terminal.
  • Listado de directorio local, que es local para la sesión de shell actual.
  • Ambas listas admiten navegación rápida mediante el uso de j / k (subir / bajar), números y búsqueda de palabras.
  • Salto libre global (por ejemplo, "cd dir" o "cd ar" para ir a / path / to / foo / bar / directory /).
treulz
fuente
1

He creado un script que tiene una funcionalidad similar al comando de oh-my-zshdirs -v que funciona en bash. Si alguna vez usó oh-my-zsh , es posible que haya notado que el historial de directorio proporcionado por el comando dirs -vse restablecerá cada vez que salga del terminal. Sin embargo, no sucederá si usa este script .

La funcionalidad:

  • Muestra la lista de los 10 directorios usados ​​más recientemente con d.

  • Salte a cualquier directorio de la lista escribiendo el número del directorio en la lista. Debe usar 0 en lugar de 10 para saltar al décimo directorio.

  • Una ruta de directorio se colocará en la parte superior de la lista cada vez que use v( vim ) para editar archivos o o( xdg-open ) para abrir un archivo desde ese directorio. O si lo desea, cada vez que visita un directorio.

Puedes verlo en acción aquí .

M Imam Pratama
fuente
0

Bueno, podría agregar este fragmento de código a su ~/.bashrc, que

  1. proporciona un comando de CD personalizado

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
  2. y proporciona un comando de búsqueda de historial de CD.

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }

Por supuesto, el comando cdhist que proporcioné es muy básico y no es lo que querías; pero es concebible usar declaraciones de caso o expansión de parámetros para lograr algo similar a lo que desea.

Incluso podría agregar alguna función de "Finalización programable", que podría usarse para agregar el cd /path/to/mydircomando completo basado en una subcadena única de /path/to/unique/mydir, aunque ese método aún requeriría que escriba cd unique/mydir<tab>.

jpaugh
fuente
1
Leí mal su código y encontré el dirscomando de bash que hace esencialmente lo mismo my_dirs, pero en una línea.
idbrii
1
Guay. Entonces, no solo bash lo admite; que implementa la misma. Desearía tener más tiempo para estudiar la profunda magia de bash. Por supuesto, esto solo admite recordar pushd, no cd. Pero supongo alias cd=pushdque sería la forma más elegante.
jpaugh
0

Usted puede construir su propio cdcomando con pushd, popd, dirs órdenes internas.

Uso

  • cd -- (enumerar el historial actual)

  • cd -num (vaya al directorio num)

  • cd - (ir al directorio anterior)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd
mug896
fuente
-1

Arme esta herramienta, que combina soluciones anteriores para almacenar un historial global de CLI global con una herramienta interactiva de grepping llamada percol (asignada a C ^ R). Lo uso para recuperar comandos por donde se ejecutaron o para encontrar un directorio mediante un comando. Todavía está resbaladizo en la primera máquina que comencé a usar, ahora con un historial de CLI> 2 años.

La herramienta grep funciona tanto en ruta como en comando, pero aún puede ser útil para usted. Ver también 'dirs -v' en zsh

https://github.com/gawells/ariadne

Gordon Wells
fuente
Esto almacena un historial de CLI con ruta, comando y fecha. No es solo de ruta, pero sigue siendo útil para el historial de búsqueda de búsqueda inversa (bash y zsh)
Gordon Wells
Creo que olvidó vincular a su herramienta. Según su descripción, sospecharía que es deficiente porque los comandos solo funcionan desde donde se invocan. Entonces cd share/mansolo funciona si ya estoy en / usr.
idbrii
¡Uy! mi mal, pensé que pondría la url en el texto, no noté que algo salió mal
Gordon Wells