Wie kann ich ein Verzeichnis erstellen und mein Arbeitsverzeichnis in das neue Verzeichnis ändern?

18

Ich suche nach einer Möglichkeit, ein Verzeichnis zu erstellen und mein aktuelles Arbeitsverzeichnis mit einem einzigen Befehl in ein neu erstelltes Verzeichnis zu ändern. Wie kann ich das machen?

dh anstatt zu tun

user@Computer:~$ mkdir NewDirectory
user@Computer:~$ cd NewDirectory
user@Computer:~/NewDirectory$ 

Ich will das tun

user@computer:~$ **command** NewDirectory
user@Computer:~/NewDirectory$

Was kann der Befehl sein?

TheKojuEffect
quelle

Antworten:

27

Wenn Sie wirklich möchten, dass es sich nur um einen Befehl handelt, empfehle ich, Folgendes zu Ihrem Befehl hinzuzufügen .bashrc:

md () { mkdir -p "$@" && cd "$1"; }

Die Eingabe md fooauf der Kommandozeile wird dann erstellen Sie ein Verzeichnis mit dem Namen foound cdin sie unmittelbar danach. Bitte beachten Sie, dass Sie Ihr System neu laden müssen, .bashrcdamit die Änderungen wirksam werden (dh eine neue Konsole öffnen oder ausführen source ~/.bashrc).

Vgl. http://www.commandlinefu.com/commands/view/3613/create-a-directory-and-change-into-it-at-the-selbe-time auch für mögliche Alternativen.

Michael Biech
quelle
19

mkdir "NewDirectory" && cd "NewDirectory"

  • Der Teil hinter dem &&wird nur ausgeführt, wenn der erste Befehl erfolgreich ist.
  • Es wird im Bash-Handbuch eine Liste von Befehlen genannt .
  • Es gibt auch eine Kurzfassung:

    mkdir "NewDirectory" && cd "$_"
    
  • Beispiel von der Kommandozeile:

    $ false && echo "yes"
    $ true && echo "yes"
    yes
    
  • (edit) Add "zu den Befehlen, da das Verzeichnis möglicherweise ein Leerzeichen enthält.

Rinzwind
quelle
mkdir "NewDir" && cd "$_"funktioniert besser, als mkdir "NewDir" && cd "NewDir"wenn die automatische Vervollständigung nicht funktioniert. Übrigens, was ist "$ _"?
TheKojuEffect
Darüber hinaus wäre es sehr praktisch, wenn wir einen Switch anhängen könnten, um in ein mkdirneu erstelltes Verzeichnis zu wechseln.
TheKojuEffect
@TheKojuEffect $ _ siehe gnu.org/software/bash/manual/bashref.html#Lists Bezüglich des letzten: Niemand hindert Sie daran, einen Alias ​​oder eine Funktion im Inneren zu verwenden .bashrc;)
Rinzwind
7

Dafür gibt es keine eingebaute Funktion, aber Sie können die Shell-Funktionalität verwenden, um zu verhindern, dass Sie das Argument des cdBefehls nach der Ausführung erneut eingeben müssen mkdir:

  • Geben Sie cd dann Esc .(oder Alt+ .) ein, um das letzte Argument aus dem vorherigen Befehl einzufügen.
  • cd !$Führt cddas letzte Argument des vorherigen Befehls aus.
  • Drücken Sie Updie vorherige Befehlszeile zu erinnern, dann bearbeiten , sie zu ändern mkdirin cd.

Sie können eine einfache Funktion zum Ändern und Ändern des Verzeichnisses definieren in ~/.bashrc:

mkcd () { mkdir "$1" && cd "$1"; }

Laden Sie Ihr .bashrc( . ~/.bashrc) neu oder starten Sie bash neu, und jetzt können Sie tippen mkcd new-directory.

Diese einfache Version schlägt in einigen ungewöhnlichen Fällen fehl, bei denen es um seltsame Verzeichnisnamen oder ..symbolische Links geht. Hier ist einer, der es tut. Erläuterungen finden Sie in der Unix- und Linux-Version dieser Frage .

mkcd () {
  case "$1" in
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}
Gilles 'SO - hör auf böse zu sein'
quelle
Mein +1 ist speziell für die Bash-spezifischen Verweise auf die Argumente des letzten Befehls.
0xC0000022L
+1 für Überentwicklung. Holzwolle! :)
mhvelplund
3
mkdir -p "as/many dirs/as you/want" && cd "$_"

Es gibt eine Lösung, die oben aufgeführt ist (dieselbe wie meine Lösung, aber ohne Option -p), aber ich denke, sie hat ein paar Fallstricke.

man mkdir
...
-p, --parents
       no error if existing, make parent directories as needed
...

Daraus ergeben sich zwei Vorteile:

  1. Wir können so viele Unterverzeichnisse wie nötig auf einmal erstellen
  2. Wenn das Verzeichnis vorhanden ist, wird kein Fehler ausgegeben, und es kann weiterhin zum vorhandenen Verzeichnis gewechselt werden.

&& cd "$_"wechselt in das neu erstellte Verzeichnis, da $_hold den Wert my zurückgabmkdir

thebugfinder
quelle
das funktioniert bei mir
alhelal