私はこれをたくさん繰り返しています。
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
組み込みコマンドはありませんが、mkdir
thenを呼び出す関数を簡単に作成できますcd
。
mkcd () {
mkdir "$1"
cd "$1"
}
このコードを~/.bashrc
ファイルに入れます(~/.kshrc
kshユーザーまたは~/.zshrc
zshユーザーの場合)。という関数を定義しますmkcd
。"$1"
関数を実行すると、関数の引数に置き換えられます。
この単純なバージョンにはいくつかの欠陥があります。
- 一連のサブディレクトリを一度に作成することはできません。修正:
-p
オプションを 。mkdir
mkcd mydierctory/newsub
mydierctory
mydierctory/newsub
newsub
mydirectory
- 引数が
-
but で始まる-
場合、mkdir
and はcd
それをオプションとして解釈します。もしそうなら、-
それはcd
意味として解釈されます$OLDPWD
。+
後にゼロ個以上の数字が続くと、zshcd
はそれをディレクトリスタックのインデックスとして解釈します。--
引数の前に渡すと、最初の問題は解決されますが、残りの2つの問題は解決されません。./
相対パスの場合は、パラメータを前に追加することでこれらすべての問題を解決できます。 mkdir
Not FollowCDPATH
、ただし従うので、開始しない値 (やや異常な構成) をcd
設定すると、作成したばかりのディレクトリとは異なるディレクトリに移動できます。相対パスの前にプレフィックスを付けると、この問題は解決されます(無視されます)。CDPATH
.
cd
./
CDPATH
mkdir
失敗した場合は実行を試みますcd
。修正:&&
2つのコマンドを分離するために使用されます。
それでもとても簡単です。
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
このバージョンでは、goへの引数にシンボリックリンクを含めて渡すなど、極端な場合に作成されたディレクトリとは異なるディレクトリcd
に移動することができます。たとえば、現在のディレクトリがへのシンボリックリンクである場合(つまり)への変更を作成します。シェルは現在のディレクトリのシンボリックリンクも追跡するため、引数でシンボリックリンクを見つけるだけでは十分ではありません。したがって、新しいディレクトリ()に変更するのではなく、この問題を解決する方法は、組み込み関数に最初にすべてのパスを確認させることです。コンポーネント(存在しない場合は意味がないため、パスコンポーネントを表示する必要はありません)。mkdir
mkcd
..
/tmp/here
mylink
/somewhere/else
mkdir mylink/../foo
/somewhere/foo
cd mylink/../foo
foo
/tmp/here/foo
cd /tmp/mylink; mkdir ../foo; cd ../foo
/somewhere/else/foo
/tmp/foo
cd
..
foo/..
foo
mkdir
..
私たちは強力ですが、少しフィビリンの私はバージョンに達しました。
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を復元しようとします。
前の行の単語を再入力する必要がない技術的でない方法もあります。
cd
then 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"
}
これは、ディレクトリがすでに存在していても機能することを意味します。