Gibt es in einer Unix-Shell (insbesondere Ubuntu) eine Möglichkeit, das Verzeichnis in das x-te Verzeichnis zu ändern, das vom Befehl ls ausgegeben wurde? Ich weiß, dass Sie ein Verzeichnis auf mehrere Arten sortieren können, aber verwenden Sie die Ausgabe von ls, um das x-te Verzeichnis zu erhalten?
Eine Beispiel-Shell:
$ ls
$ first_dir second_dir third_really_long_and_complex_dir
wo ich in das dritte_wirklich_lange_und_komplexe_Verzeichnis wechseln möchte, indem ich 3 (oder 2 im richtigen Array-Format) übergebe. Ich weiß, dass ich einfach kopieren und einfügen könnte, aber wenn ich bereits die Tastatur verwende, wäre es einfacher, etwas wie „cdls 2“ oder so etwas einzugeben, wenn ich den Index kenne.
AKTUALISIEREN
Für alle, die das noch sehen: Ich habe diese Frage gestellt, als ich noch ein echter Linux-/Bash-Neuling war und nicht wusste, dass es so etwas wie die Tab-Vervollständigung gibt.
Antwort1
Das Hauptproblem bei cd
einer interaktiven Sitzung besteht darin, dass Sie im Allgemeinen das aktuelle Verzeichnis der Shell ändern möchten, die die Eingabeaufforderung verarbeitet. Das bedeutet, dass das Starten einer Unter-Shell (z. B. eines Skripts) nicht hilfreich wäre, da etwaige cd
Aufrufe die übergeordnete Shell nicht beeinflussen würden.
Abhängig von der Shell, die Sie verwenden, können Sie jedoch möglicherweise eineFunktionum dies zu tun. Zum Beispiel in Bash:
function cdls() {
# Save the current state of the nullglob option
SHOPT=`shopt -p nullglob`
# Make sure that */ expands to nothing when no directories are present
shopt -s nullglob
# Get a list of directories
DIRS=(*/)
# Restore the nullblob option state
$SHOPT
# cd using a zero-based index
cd "${DIRS[$1]}"
}
Beachten Sie, dass ich mich in diesem Beispiel absolut weigere, die Ausgabe von zu analysieren ls
.wegen vielen Gründen. Stattdessen lasse ich die Shell selbst eine Liste von Verzeichnissen (oder Links zu Verzeichnissen) abrufen ...
Allerdings vermute ich, dass die Verwendung dieser Funktion (oder irgendetwas in dieser Art) ein sehr guter Weg ist, sich selbst in ein riesiges Chaos zu stürzen - wie die Verwendung rm
nach dem Wechsel in das falsche Verzeichnis. Die automatische Vervollständigung von Dateinamen ist schon gefährlich genug, ohne dass man sich dazu zwingen musszählen...
Antwort2
Ich habe eine Funktion dafür:
Funktion cdi. { IFS=$'\n' SEITE=${1:-1} LPP=${2:-11} erste=$(( 1 + LPP * SEITE - LPP )) letzte=$((LPP * SEITE)) wähle cd_into in $(find . -maxdepth 1 -type d -printf "%P\n" |\ sed -n $erster,${letzter}p); Tun AUSFAHRT=-1; wenn [[ $REPLY == n ]]; dann sei PAGE=PAGE+1; cdi. $PAGE $LPP; EXIT=$? elif [[ $REPLY == p ]]; dann lass PAGE=PAGE-1; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == m ]]; dann sei LPP=LPP*2; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == l ]]; dann sei LPP=LPP/2; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == q || $REPLY == 0 ]];dann returniere 0; fi wenn [ $EXIT -eq 0 ]; dann return 0; fi cd_into=${cd_into//\~/$HOME} wenn [ -d "$cd_into" ];dann cd "$cd_into"; returniere 0; sonst echo "Ups! \`$cd_into' ist kein Ordner (?)" fi Erledigt IFS nicht gesetzt }
Benutzen:
$cdi. 1) .mozilla.new 3) .swt 5) tmp 7) .vim 9) .ssh 2) .crack-attack 4) Downloads 6) .Eterm 8) .frozen-bubble 10) .irssi Welche #?: