Apakah ada jalan pintas ke mkdir foo dan langsung cd ke dalamnya?

89

Ini adalah sesuatu yang sering saya lakukan

$ mkdir foo
$ cd foo

Ini berfungsi sebagai satu perintah, tetapi lebih banyak penekanan tombol dan tidak menghemat waktu.

$ mkdir foo && cd foo

Apakah ada jalan pintas untuk ini?

Sunting

Dengan menggunakan bantuan di bawah ini, ini tampaknya menjadi jawaban yang paling elegan.

# ~/.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
sumber
1
Anda dapat mengubah nama fungsi menjadi mkdirjika Anda menggunakannya, command mkdir $1bukan hanya mkdir $1di tubuh fungsi.
Andy
2
(1) mengapa tidak sekadar "mkdir $ 1; cd $ 1" alih-alih "&&"? dengan cara itu "cd" berhasil bahkan jika "mkdir" gagal, dan Anda tidak perlu perancah tidak-sudah-ada. (2) seperti yang ditulis fungsi Anda tidak akan berfungsi (untuk meminta Anda untuk nama direktori). Anda perlu memasukkannya ke dalam klausa "jika" yang terpisah dari tes keberadaan (saat ini dalam "elif").
quack quixote

Jawaban:

45

Saya bukan ahli Linux / bash, tetapi coba letakkan ini di blog Anda .bashrc.

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

PS Terima kasih kepada Dennis untuk menggunakan command mkdir.

Andy
sumber
2
Alih-alih `which mkdir`, gunakan saja command mkdir.
Dennis Williamson
1
Terima kasih Dennis. Tidak ada yang di bawah man command- dapatkah Anda mengarahkan saya ke referensi? (Saya bisa mencari tahu apa fungsinya, tetapi membayarnya harus teliti;)
Andy
2
commanddijelaskan dalam manualbash (yang merupakan built-in; ini bukan perintah terpisah). Anda juga bisa mencoba help command.
grawity
Itu juga berfungsi untuk zsh btw
Florian Loch
94

The bash, zshKerang

Jika Anda tidak ingin fungsi lain mengingat dan tidak keberatan bashism:

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

The $_(dollar garis bawah) variabel perintah bash berisi parameter terbaru. Jadi, jika pengguna mengetik berikut di baris perintah:, echo foo bar && echo $_ bazmaka hasilnya adalah sebagai berikut:

foo bar
bar baz

The fishShell

Di kulit ikan, saya akan mengetik yang berikut:

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

Tombol alt dikombinasikan dengan tombol panah atas atau bawah akan menggilir riwayat parameter perintah.

kzh
sumber
4
Ini juga berfungsi zsh.
Nabil Kadimi
3
Bisakah Anda jelaskan apa $ _ itu? Pemula di sini.
arg20
@NabilKadimi Apakah maksud Anda <kbd> Alt <kbd> + <kbd> ⬆ <kbd> bekerja dengan baik di Zsh? Sebenarnya, dengan zsh 5.4.2 dan on-my-zsh, Alt + ⬆ memberi saya karakter 'A'.
Akhir pekan
+1 untuk $ _ - Flanders Seksi Bodoh!
cig0
22

Untuk pengguna oh-my-zsh :
$ take 'directory_name'

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

Avijit Gupta
sumber
1
Bisakah Anda menjelaskan ini dengan lebih detail?
bwDraco
@ bbwaco type take, maka Anda akan dapatkan take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi file yang Anda dapatkanfunction take() { mkdir -p $@ && cd ${@:$#} }
Akhir Pekan
10

Bagaimana dengan:

$ mkdir newdirname; cd $_

Ini sedikit lebih mudah daripada menggunakan &&, menggabungkan jawaban quack quixote dan kzh.

Alex
sumber
26
Intinya &&adalah bahwa cdtidak akan dieksekusi jika mkdirperintah gagal
slhck
1
@ slhck sebenarnya itu adalah titik quixote: cd bahkan jika mkdir gagal (misalnya jika sudah ada, memaksa pengguna untuk menulis perintah kedua untuk benar-benar cd ke jalan). Namun berlawanan dengan apa yang dikatakan jawaban ini, itu bukan untuk kemudahan: && tidak lebih rumit dari;
moala
7

Anda dapat mencoba sesuatu seperti ini:

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

Simpan skrip ini ke beberapa tempat yang ada di jalur Anda, misalnya, / usr / local / bin atau ~ / bin (Anda harus meletakkan yang terakhir ini di jalur Anda di file ~ / .profile Anda). Maka Anda bisa menyebutnya.

petersohn
sumber
4
bagaimana ini bisa bekerja? tampaknya hanya cddi dalam konteks eksekusi ~/bin/mkcdskrip, bukan penelepon skrip.
Erik Allik
5
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
mshameers
sumber
2

Ini adalah fungsi sederhana yang saya taruh di ~/.config/fish/config.fishfile saya yang menyelesaikan tugas ini:

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

The -pvtag memungkinkan untuk pembuatan direktori dengan sub-direktori.

Alex Fenwood Hughes
sumber
0

Tergantung pada hasil yang diinginkan jika direktori sudah ada.

Gagal jika direktori sudah ada

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

Ganti direktori bagaimanapun

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

Gunakan mkcd some / path / ke / my / dir

Bingles
sumber
0

Saya menemukan bahwa fungsi di bawah ini hanya dapat membuat satu direktori, jika saya ingin membuat subdirektori pada saat yang sama, itu tidak berfungsi:

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

Jadi saya mengubahnya dan sekarang berfungsi dengan baik!

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