ディレクトリを作成して同時にディレクトリに移動できる1行のコードはありますか?

ディレクトリを作成して同時にディレクトリに移動できる1行のコードはありますか?

私はこれをたくさん繰り返しています。

mkdir longtitleproject
cd longtitleproject

ディレクトリ名を繰り返さずに1行で行う方法はありますか?私はここでパーティーをしています。

答え1

これがあなたに必要なシングルライナーです。追加の設定は必要ありません。

mkdir longtitleproject && cd $_

Bashでは、変数は$_前のコマンドで提供された最後の引数です。この場合、作成したばかりのディレクトリの名前です。説明したようにman bash

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi‐
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check‐
          ing  mail,  this  parameter holds the name of the mail file cur‐
          rently being checked."$_" is the last argument of the previous command.

cd $_前のコマンドの最後の引数が指定されたcd !$ため、代わりに前のコマンドcd !$の最後の引数を取得するために使用されます。シェルの歴史から:

cd ~/
mkdir folder && cd !$

ついに家に着きました(または〜/)

cd ~/
mkdir newfolder && cd $_

家の下に新しいフォルダが作成されます! (または ~/newfolder )

答え2

組み込みコマンドはありませんが、mkdirthenを呼び出す関数を簡単に作成できますcd

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

このコードを~/.bashrcファイルに入れます(~/.kshrckshユーザーまたは~/.zshrczshユーザーの場合)。という関数を定義しますmkcd"$1"関数を実行すると、関数の引数に置き換えられます。

この単純なバージョンにはいくつかの欠陥があります。

  • 一連のサブディレクトリを一度に作成することはできません。修正:-pオプションを 。mkdirmkcd mydierctory/newsubmydierctorymydierctory/newsubnewsubmydirectory
  • 引数が-but で始まる-場合、mkdirand はcdそれをオプションとして解釈します。もしそうなら、-それはcd意味として解釈されます$OLDPWD+後にゼロ個以上の数字が続くと、zshcdはそれをディレクトリスタックのインデックスとして解釈します。--引数の前に渡すと、最初の問題は解決されますが、残りの2つの問題は解決されません。./相対パスの場合は、パラメータを前に追加することでこれらすべての問題を解決できます。
  • mkdirNot Follow CDPATH、ただし従うので、開始しない値 (やや異常な構成) をcd設定すると、作成したばかりのディレクトリとは異なるディレクトリに移動できます。相対パスの前にプレフィックスを付けると、この問題は解決されます(無視されます)。CDPATH.cd./CDPATH
  • mkdir失敗した場合は実行を試みますcd。修正:&&2つのコマンドを分離するために使用されます。

それでもとても簡単です。

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

このバージョンでは、goへの引数にシンボリックリンクを含めて渡すなど、極端な場合に作成されたディレクトリとは異なるディレクトリcdに移動することができます。たとえば、現在のディレクトリがへのシンボリックリンクである場合(つまり)への変更を作成します。シェルは現在のディレクトリのシンボリックリンクも追跡するため、引数でシンボリックリンクを見つけるだけでは十分ではありません。したがって、新しいディレクトリ()に変更するのではなく、この問題を解決する方法は、組み込み関数に最初にすべてのパスを確認させることです。コンポーネント(存在しない場合は意味がないため、パスコンポーネントを表示する必要はありません)。mkdirmkcd../tmp/heremylink/somewhere/elsemkdir mylink/../foo/somewhere/foocd mylink/../foofoo/tmp/here/foocd /tmp/mylink; mkdir ../foo; cd ../foo/somewhere/else/foo/tmp/foocd..foo/..foomkdir..

私たちは強力ですが、少しフィビリンの私はバージョンに達しました。

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(練習:最初の呼び出しでサブシェルを使用するのはなぜですかcd?)

mkdirが失敗した場合は、現在のディレクトリが変更されていないことを確認したいと思います。シェルに現在のディレクトリに変更する権限がない場合は、cd - または$ OLDPWDを使用して再度変更するだけでは不十分です。また、cdを呼び出すとOLDPWDが更新されるため、一度だけ実行するか、OLDPWDを復元しようとします。


前の行の単語を再入力する必要がない技術的でない方法もあります。

  • cdthen Esc .(またはAlt+)を入力して、前のコマンド.の最後の引数を挿入します。
  • cd !$cd前のコマンドの最後の引数で実行されます。
  • を押してUp前のコマンドラインを呼び出し、編集してにmkdir変更しますcd

しかし、参考にしてくださいu+そのバージョン以降、ksh93では動作しません。、93u+m/1.0.0-alpha+d1483150 2021-01-05で修正

答え3

Oh My Zshを使用すると、次のコマンドがあります。取るそれがまさにそれがすることです。こんな感じです。

take myfolder

実際、私はこれを偶然見つけました。私は見ただけでリストにあります。これは不正行為ですOh My Zsh GitHub Wikiから。これは非常に便利なコマンドであり、明らかに直接作成するのは簡単です。

答え4

~によると生産性を向上させるために、シェル構成ファイルにどのようなカスタマイズを適用しましたか?、これが私がする方法です:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

これは、ディレクトリがすでに存在していても機能することを意味します。

関連情報