Gibt es eine Abkürzung zu mkdir foo und sofort eine CD hinein?

89

Das mache ich oft

$ mkdir foo
$ cd foo

Dies funktioniert wie ein einzelner Befehl, ist jedoch ein weiterer Tastendruck und spart keine Zeit.

$ mkdir foo && cd foo

Gibt es dafür eine Abkürzung?

Bearbeiten

Mit der Hilfe unten scheint dies die eleganteste Antwort zu sein.

# ~/.bashrc
function mkcd {
  if [ ! -n "$1" ]; then
    echo "Enter a directory name"
  elif [ -d $1 ]; then
    echo "\`$1' already exists"
  else
    mkdir $1 && cd $1
  fi
}
macek
quelle
1
Sie können die Funktion in umbenennen, mkdirwenn Sie sie command mkdir $1nicht nur mkdir $1im Funktionskörper verwenden.
Andy
2
(1) Warum nicht einfach "mkdir $ 1; cd $ 1" anstelle von "&&"? Auf diese Weise ist die "cd" erfolgreich, auch wenn das "mkdir" ausfällt und Sie das bereits vorhandene Gerüst nicht benötigen. (2) Wie geschrieben funktioniert Ihre Funktion nicht (um Sie zur Eingabe eines Verzeichnisnamens aufzufordern). Sie müssen dies in eine separate "if" -Klausel aus dem Existenztest einfügen (derzeit in "elif").
Quack Quijote

Antworten:

45

Ich bin kein Linux- / Bash-Experte, aber versuchen Sie, dies in Ihre Liste aufzunehmen .bashrc.

function mkdir
{
  command mkdir $1 && cd $1
}

PS Danke an Dennis für die Verwendung command mkdir.

Andy
quelle
2
`which mkdir`Verwenden Sie stattdessen einfach command mkdir.
Dennis Williamson
1
Danke Dennis. Da ist nichts drunter man command- kannst du mich auf eine Referenz verweisen? (Ich kann herausfinden, was es tut, aber es
Andy
2
commandwird im Handbuch von beschriebenbash (in das es integriert ist; es ist kein separater Befehl). Sie könnten es auch versuchen help command.
Grawity
Das funktioniert auch für zsh btw
Florian Loch
94

Die bash, zshMuscheln

Wenn Sie nicht möchten, dass sich eine andere Funktion erinnert, und Bashismen nicht stören:

$ mkdir /home/foo/doc/bar && cd $_

Die $_Befehlsvariable (Dollar-Unterstrich) bash enthält den neuesten Parameter. Wenn ein Benutzer also Folgendes in die Befehlszeile echo foo bar && echo $_ bazeingeben würde, wäre die Ausgabe wie folgt:

foo bar
bar baz

Die fishMuschel

In der Fischschale würde ich Folgendes eingeben:

> mkdir / home / foo / doc / bar
> cd alt + ↑

Die Alt-Taste in Kombination mit der Aufwärts- oder Abwärtspfeiltaste durchläuft den Befehlsparameterverlauf.

kzh
quelle
4
Das funktioniert zshauch.
Nabil Kadimi
3
Können Sie erklären, was $ _ ist? Neuling hier.
arg20
@NabilKadimi Meinten Sie, dass <kbd> Alt <kbd> + <kbd> ⬆ <kbd> in Zsh gut funktioniert? In zsh 5.4.2 und on-my-zsh gibt mir Alt + ⬆ das Zeichen 'A'.
Wochenende
+1 für die $ _ - Dumme Sexy Flandern!
cig0,
22

Für oh-my-zsh Benutzer:
$ take 'directory_name'

Referenz: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet

Avijit Gupta
quelle
1
Können Sie das näher erläutern?
bwDraco
@bwDraco type take, dann wirst du bekommen take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi die datei bekommst du dannfunction take() { mkdir -p $@ && cd ${@:$#} }
Wochenende
10

Wie wäre es mit:

$ mkdir newdirname; cd $_

Es ist ein bisschen einfacher, als && zu verwenden und die Antworten von quack quixote und kzh zu kombinieren.

Alex
quelle
26
Der Punkt &&ist, dass cdnicht ausgeführt wird, wenn der mkdirBefehl fehlschlägt
slhck
1
@slhck eigentlich war das der springende Punkt: cd, selbst wenn mkdir fehlschlägt (zum Beispiel, wenn es bereits existiert und der Benutzer dazu gezwungen wird, einen zweiten Befehl zu schreiben, um tatsächlich cd in den Pfad zu schreiben). Ganz im Gegensatz zu dem, was in dieser Antwort steht, ist dies nicht der Einfachheit halber so: && ist nicht komplizierter als;
Moala
7

Sie können so etwas ausprobieren:

#!/bin/sh
mkdir $1 && cd $1

Speichern Sie dieses Skript an einem Ort, der sich in Ihrem Pfad befindet, z. B. / usr / local / bin oder ~ / bin (Sie müssen diesen letzten in Ihren Pfad in Ihrer ~ / .profile-Datei einfügen). Dann können Sie es einfach anrufen.

petersohn
quelle
4
wie kann das gehen Es scheint nur cdim Kontext der Ausführung des ~/bin/mkcdSkripts, nicht der Aufrufer des Skripts.
Erik Allik
5
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
mshameers
quelle
2

Hier ist eine einfache Funktion, die ich in meine ~/.config/fish/config.fishDatei eingefügt habe und die diese Aufgabe erfüllt:

function mkcd
    mkdir -pv $argv;
    cd $argv;
end

Das -pvTag ermöglicht die Erstellung von Verzeichnissen mit Unterverzeichnissen.

Alex Fenwood Hughes
quelle
0

Abhängig vom gewünschten Ergebnis, ob das Verzeichnis bereits existiert.

Fehler, wenn das Verzeichnis bereits vorhanden ist

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

Wechseln Sie das Verzeichnis trotzdem

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

Usage mkcd some / path / to / my / dir

bingles
quelle
0

Ich habe festgestellt, dass die folgende Funktion nur ein Verzeichnis erstellen kann. Wenn ich gleichzeitig Unterverzeichnisse erstellen möchte, funktioniert dies nicht:

function mkdir
{
  command mkdir $1 && cd $1
}

Also habe ich es geändert und jetzt funktioniert es super!

function mkcd
{
  command mkdir -pv $1 && cd $1 && echo "Now in `pwd`"
}
user5723841
quelle