Usare cd per salire su più livelli di directory


39

Ho a che fare con progetti Java che spesso sfociano in cartelle profondamente annidate (/ path / to / project / com / java / lang / qualunque cosa, ecc.) Ea volte vogliono essere in grado di saltare, diciamo, 4 livelli di directory verso l'alto. Digitare cd ../../../ .. è una seccatura, e non voglio un link simbolico. C'è qualche flag su cd che ti permette di salire su più livelli di directory (nella mia testa, sarebbe qualcosa come cd -u 4)? Sfortunatamente non riesco a trovare alcuna pagina man specifica per cd, ma ottengo solo l'inutile pagina "builtins".


1
Modifica bash per interpretare cd ...dove il numero di '.' sarebbe il numero di livelli da salire. Ciò provocherebbe un conflitto di cui non sono a conoscenza?

Per quelli che vengono qui per MacOS è possibile installare zshe Oh My Zshquale è un'alternativa migliore a bashe quindi si può semplicemente fare cd ...(più punti) come dovrebbe essere
Dominic

Risposte:


29

Oppure ... prova questo: (yay Google)

Navigare nella directory utilizzando ..n:

Nell'esempio seguente, ..4 viene utilizzato per salire al livello di 4 directory, ..3 per salire al livello di 3 directory, ..2 per salire al livello di 2 directory.

Aggiungi il seguente alias a .bash_profile e accedi nuovamente.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(eccetera)

Vedi Hack # 2


10
Preferirei usare gli alias .., ...e ....poiché sono più veloci da digitare, ma il principio degli alias è lo stesso ovviamente.
Bernhard,

1
@bernhard Sei il benvenuto, perché non credo che causerebbe conflitti. L'ho lasciato così com'è perché l'ho citato dal sito web.
cutrightjm,

Anche la shell 4DOS.EXE per DOS era supportata cd ..., cd ....ecc. Era molto utile.
Alexios,

..... non è più veloce di ..4, infatti è più lento di 2 caratteri ..
Ryan,

29

Una funzione semplice, anche con un alias:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(Puoi definirlo ~/.bashrcse lo vuoi in ogni caso).

È semplice da usare:

$ cd.. 10

Ben fatto! Per me va bene! Bash 4.3.11
Carlos Nunez,

2
Buona risposta; si potrebbe desiderare di sottolineare che questo è meglio di soluzioni come eval $(printf "cd ..;%.s" $(seq $1))il quale cdpiù volte, perché ~-alias $OLDPWDè impostato per la directory di lavoro da prima invocazione, piuttosto che a una directory intermedia. PS: semplifica cd $(printf %.s../ $(seq "$1"))se vuoi.
Toby Speight,

10

Una soluzione semplice e di bassa tecnologia che non necessita di alcuna configurazione. Funziona solo nelle shell con bashmodifica dei comandi in stile, però.

  • genere cd ..
  • Premere Up-arrow Returntutte le volte che è necessario. Molto veloce se si usano due dita.

2
ahah, non è una brutta risposta immagino :)
joshmcode

8

Si scopre che la risposta corretta è 'cd + n', dove n è il numero di livelli che si desidera salire. Peccato che questo non sia documentato da nessuna parte!


17
almeno non funziona in bash.
HongboZhu,

5
Non funziona su bash 4.2.25 come fornito con Debian. Per curiosità, quale * nix e / o shell stai usando?
Alexios,

Bash ha un built-in chiamato dirsche accetta [+ n] come argomento e stampa l'ennesima directory univoca che è stata aggiunta tramite pushd. Se alias cda pushd, allora è possibile utilizzare questo. Tuttavia, si noti che questa non è tecnicamente una risposta alla domanda del PO, poiché ciò ha a che fare con directory univoche , il che significa che l'ordine viene incasinato nel tempo, quando si ritorna alle stesse directory.
Brian Peterson,

Sì, pushde popdprendi anche un'opzione [+ n], motivo per cui è in grado di funzionare. Inoltre, sebbene sia imperfetto e indiretto, immagino che questo possa essere usato come risposta alla domanda. Spesso hai visitato le directory sopra di te di recente, quindi saranno nelle ultime 10 directory memorizzate dallo stack di directory.
Brian Peterson,

non ha funzionato per me ...
Vass

4

È possibile scrivere una funzione (deve essere una funzione, poiché si desidera modificare lo stato della shell stessa, vale a dire la directory di lavoro; un comando esterno influirebbe solo sul proprio processo).

Ecco una funzione che salirà un numero di livelli passati come argomento (default 1) nella struttura della directory fisica (quindi, come cd -P .., n volte):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Usalo in questo modo:

up 4

1
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
Paperino

1
D'accordo, ho aggiunto alcuni commenti per aiutare.
mgild

Essere pignoli, non up 4equivale davvero ad cd /some/dir/assumere $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop,

2

Non esattamente quello che stai chiedendo, ma dovresti esaminare pushde popd. Li trovo molto più utili per la navigazione delle cartelle rispetto ad alcuni cd...alias

Se vai avanti e indietro da un paio di aree fisse, la cosa normale è avere alias.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

Invece di usare gli alias puoi anche usare la seguente funzione bash:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(o come una battuta: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

L'aggiunta di questo al tuo ~/.bashrcfile lo renderà disponibile nel tuo terminale e la creazione di una stringa ../../../../../../prima di chiamare cdpermetterà anche cd -di tornare indietro alla directory di avvio.

Un'implementazione più utile potrebbe contenere anche alcuni controlli di input dell'utente:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}


0

Prova il parametro di ambiente usato raramente CDPATH. Quindi potrebbe non essere necessario impostare esplicitamente il livello.

Esempio:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Se si lavora su più progetti, è possibile effettuare l'impostazione CDPATH in un file di ambiente specifico del progetto. E attivalo con uno spessore per un'ulteriore automazione.

Tendo a usare pushd e popd abbastanza. Tendo ad usare CDPATH per farmi saltare tra gli alberi del progetto piuttosto che i sottodiretti in un progetto - ma al momento sto lavorando a molti piccoli progetti, non a pochi grandi progetti. :)


0

Se si è precedentemente nella directory di destinazione:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

Dai un'occhiata a DirB . È uno script BASH che ti consente di creare segnalibri come segue:

OPERAZIONI

  • s Salva un segnalibro di directory
  • g passare a un segnalibro o a una directory denominata
  • p spingere un segnalibro / directory nello stack dir
  • r rimuovere il preferito salvato
  • d visualizzare il percorso della directory con segnalibro
  • sl stampa l'elenco dei segnalibri di directory

Molto semplice, molto efficace.


0

Un passo avanti dalla risposta di @ Grigory:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

Questo è :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

Si è stufato di questo stesso identico problema e alla fine ha finito per scrivere cd-plus . Un'utilità CLI a singolo file che consente di creare più directory.

uso

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

Aggiungendo il codice qui sotto al tuo .bashrcsarà esteso cdil completamento per onorare tre notazioni più punti

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

Una volta eseguito questo frammento nella shell bash digitando cd .../e colpendo <TAB>completerai il percorso e verranno ../../elencati i percorsi relativi di tutte le directory che hanno due livelli, per esempio.

Aggiornamento : bash-completiondeve essere installato per avere accesso al _cdmetodo indicato nel codice sopra. È installabile dalla maggior parte dei gestori di pacchetti da riga di comando

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.