何度も繰り返していることに気づきました:
mkdir longtitleproject cd longtitleproject
ディレクトリ名を繰り返さずに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)
コメント
- 地球上でこれが受け入れられない理由
- @JSmyth同意する、これはネイティブシェル機能を使用するワンライナーです
- OPは2つのコマンドの使用を回避しようとしていると思います。この回答は、
mkdir foo && cd foo
を実行するのと(ほぼ)有効ですが、’は便利ではありません。 - OPは’ディレクトリ名を繰り返す必要のないワンライナーを求めると、これが
- 賛成票によって’多くの人がこの回答が役立つと感じていることは明らかです。 ‘この回答を選択しなかった理由を説明します’:私は’キーがホーム行から遠く離れているため、
&& cd $_
と誤って入力する可能性があります。したがって、技術的には正しいものの、’は人間工学的ではありません。 ‘は環境に依存せず、’知っておくと便利です。ありがとう!
回答
組み込みのコマンドはありませんが、次のような関数を簡単に作成できます。 mkdir
を呼び出してからcd
を呼び出します:
mkcd () { mkdir "$1" cd "$1" }
このコードを入力します~/.bashrc
ファイル(またはkshユーザーの場合は~/.kshrc
、zshユーザーの場合は~/.zshrc
)。 mkcd
という関数を定義します。"$1"
は、実行時に関数の引数に置き換えられます。
この単純なバージョンにはいくつかの欠陥があります:
- サブディレクトリのチェーンを一度に作成することはできません。修正:
-p
オプションをmkdir
。(これは、タイプミスが検出されなくなるリスクを高めるため、望ましい場合と望ましくない場合があります。たとえば、mkcd mydierctory/newsub
はおよびmydierctory/newsub
をnewsub
内に作成する場合既存のmydirectory
。) - 引数が
-
で始まるが、、次にmkdir
とcd
はそれをオプションとして解釈します。-
の場合、cd
は$OLDPWD
を意味すると解釈します。+
の後に0桁以上が続くと、zshのcd
はそれをディレクトリスタックのインデックスとして解釈します。引数の前に--
を渡すことで、最初の問題を修正できますが、他の2つは修正できません。相対パスの場合は、引数の前に./
を付けることで、これらすべての問題を修正できます。 -
mkdir
CDPATH
には従いませんが、cd
に従うので、CDPATH
を設定した場合.
で始まらない値(確かに多少変わった構成)にすると、cd
は別のディレクトリに移動する可能性があります作成されたばかりのもの。相対パスの前に./
を付けると、これが修正されます¹(CDPATH
は無視されます)。 -
mkdir
が失敗し、cd
を実行しようとします。修正:&&
を使用して2つのコマンドを分離します。
それでもかなり簡単です:
mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }
このバージョンでは、cd
を別のディレクトリに移動させる可能性がありますmkdir
が1つのエッジケースで作成された場合:mkcd
の引数に..
が含まれている場合シンボリックリンクを通過します。たとえば、現在のディレクトリが/tmp/here
で、mylink
が/somewhere/else
へのシンボリックリンクである場合、次にmkdir mylink/../foo
は/somewhere/else/foo
を作成しますが、cd mylink/../foo
はfoo
。シェルは自身の現在のディレクトリ内のシンボリックリンクも追跡するため、引数でシンボリックリンクを探すだけでは不十分です。そのため、cd /tmp/mylink; mkdir ../foo; cd ../foo
は新しいディレクトリ(/somewhere/else/foo
)が/tmp/foo
に追加されます。これを修正するには、cd
ビルトインですべてのcd
を解決します。 div id = “8b3479c76e”>
パスコンポーネントを最初に(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
と入力し、次に Esc と入力します。(または Alt + 。)を使用して、前のコマンドの最後の引数を挿入します。 -
cd !$
は、前のコマンドの最後の引数でcd
を実行します。 - Up を押して前のコマンドラインを呼び出し、編集します。
mkdir
をcd
に変更します。
¹ただし、注意してください。 u+
バージョン以降、ksh93では機能しません。93u+ m /1.0.0-alphaで修正されました+ d1483150 2021-01-05
コメント
- ありがとう!Escは私にとって最も便利なようですが、キーシーケンスを実行します特別なmがありますeaning?
- ‘はBashだけです(
ksh
から継承され、)”前のコマンドの最後の単語を繰り返します”。よく使用します。 - @Gilles I ‘ ” Gilles “アカウントは、実際には専門家のパネルによって共有されています。 😉
- @StephaneChazelas
/a/b/..//
は実際には機能しますが、/a/b/../c
は機能しません。修繕。 私は’より多くの聴衆に質問を投げかけました。 -
mkcd() { mkdir -p "$1" && cd "$1"; }
は’ zsh(の私のインスタンス)では問題ではないようです。mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(セットアップとを含む)は、作成されたもの(および私が期待したもの)である/tmp/here/foo
を表示します。bash
が誤って/var/tmp/somewhere/foo
を作成および変更します。
回答
私はほぼ1時間ごとに次のように入力するため、この動作をスクリプト化することは私には思いもよらなかったでしょう…
$ mkdir someDirectory<ENTER> $ cd !$
ここで、bashは!$
を最後の行の最後の単語に置き換えます。つまり、入力した長いディレクトリ名です。
さらに、このような状況では、ファイル名の補完が友だちです。新しいディレクトリがフォルダ内の唯一のファイルである場合、すばやくダブル TAB を実行すると、再入力せずに新しいディレクトリが表示されます。
bashで許可されるのはすばらしいことですが他の回答が示唆するような一般的なタスクをスクリプト化するには、bashが提供するコマンドライン編集機能を学習して、別のマシンで作業しているときにカスタムスクリプトが提供する構文上の糖衣構文を見逃さないようにする方がよいと思います。
コメント
- このような最も重要なbashの癖について知るのに良い場所はありますか?
- @ dominicbri7一般的に” bashコマンドライン編集”に分類されます。同じものをグーグルすると、次の結果が表示されます web.mit.edu/gnu/doc/html/features_7.html より具体的には、!$はWordDesignatorの例です。 gnu.org/softwareを参照してください。 /bash/manual/bashref.html#Word-Designators
回答
使用する場合Oh My Zsh、「 take というコマンドがあります。これはまさにこれを実行します。次のようになります。
take myfolder
実際にこれを偶然見つけました。見たところ、 このチートヒート は、Oh My Zsh GitHubwikiからのものです。これは非常に便利なコマンドであり、自分で作成するのは明らかに非常に簡単です。
コメント
- :)完璧です!ところで-Oh My Zshを使用したiTerm2。実際には3つの完璧な答えがあります。これは@jes ú s-carreraによるもので、選択した回答。設定と設定によって異なります。
回答
生産性を向上させるためにシェルプロファイルにどのようなカスタマイズを行いましたか?、これが私のやり方です:
# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" }
これは、ディレクトリがすでに存在する場合にも機能することを意味します。
コメント
- mkdirの
-p
オプションエラーを抑制します。 - mcdは既存のコマンドです。’例を挙げたばかりですが、私はそれを自分で使用しました’ mkcdより短い文字。
- @Dharmit Shah:既存の
mcd
コマンドとは何ですか?このコマンドを提供するパッケージまたはプロジェクトはどれですか? - mtoolsはmcdコマンドを提供します。そのマニュアルページには、” mcdコマンドを使用してMS-DOSディスク上のmtools作業ディレクトリを変更します。”
回答
または、短い変数をオンザフライで作成して2回使用することもできますx = longproject ; mkdir $x ; cd $x
-シェルスクリプト関数を使用するよりもまだ長いことを認めます:)
回答
これはbashスクリプト/関数で行う簡単なこと。 LinuxとMacOSの両方で動作するスクリプトを含む非常に読みやすく十分に文書化されたチュートリアルを作成しました(これも将来的に維持されます)。
チュートリアルの複雑さの目標は、次のような対象読者向けに作成することです。ユーザーが脈拍を持ち、英語を読むことができるという唯一の前提条件があるため、サポートが必要な場合はフィードバックを提供してください。
https://github.com/craigopie/shellscripts
mcdir() { if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ] then echo "Usage: [option...] {directory}" echo " -p, --path Create all directories in path " echo " -h, --help Shows this helpful information " echo return 0 fi ## create directory with a path if [ $1 = "-p" ] || [ $1 = "--path" ] then mkdir -p "$2" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$2" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 fi ## create directory in this location mkdir "$1" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$1" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 } export -f mcdir
これをインストールするには、2つありますオプション:
- 最初は
.bashrc
ファイルに関数を追加します。 - 2番目はファイルをパスに追加します次に、
.bash_profile
ファイルでファイルを入手します。
繰り返しになりますが、READMEファイルにはこれを行う方法が非常に詳しく説明されています。
頑張ってください!
回答
ここに、言及に値するわずかなバリエーションがあります:
function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" }
これをyoに追加しますur ~/.bash_profile
すると、通常どおりmkdir
を使用できます(source
” d it)、ただし、標準のmkdir
コマンドではなく上記の関数を実行するようになりました。
注:これは、受け入れられた
Gillesによる回答ですが、組み込みを(効果的に)オーバーライドする方法を示しています。
からドキュメント(少し言い換えます):
command mkdir [args]
が実行されますmkdir
とargs
は、mkdir
という名前のシェル関数を無視します。シェル組み込みコマンドまたはPATHを検索して見つかったコマンドのみが実行されます。ls
という名前のシェル関数がある場合、関数内でcommand ls
を実行すると、外部コマンドls
関数を再帰的に呼び出す代わりに
builtin
は
。
コメント
- 必ず
$dir
- @Jeff、同意しましたが、受け入れられた回答には、必要なすべての検証が含まれています。’代わりに
command
を使用する方法を紹介しています。
回答
BASH、ZSH、またはKSHへのヘルパー関数の追加
mkcd
コマンドを環境に作成します。 1行
echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc
回答
Oh-my-zshを使用している場合、take
コマンドでうまくいきます。 チートシートをご覧ください。
回答
上記の回答を自動化し、1回限りの実行可能スクリプトを作成しました:
fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc
これを新しいファイルにコピーするだけですmkcd.sh
を実行し、bash mkcd.sh
によってターミナルで一度だけ実行します。次に、source ~/.bashrc
を実行して、現在のセッションで機能するようにします。
この後、mkcd some_dir
を使用して作成できます。
コメント
-
ファイル(すでに回答があります)?そして、この
mkcd.sh
スクリプトを作成することをどのように提案しますか?エディターで、多分?これは、~/.bashrc
を編集するよりも手間がかかるようです。これは受け入れられた答えに対してどのような利点がありますか? ………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………引用の問題が原因でこれは失敗します。これは、自分で試したことがないことを示しています。 - 申し訳ありませんが、回答に書いたとおり、上記の回答を使用しました。それは機能します。 ‘信じられない場合は、試してみてください。そして、試さないことについて、私は今日、bashとpythonでそのようなスクリプトを書くために一日を使いました。
- 私はあなたが書いたものを試しました。 機能しません。
mcd
from unix.stackexchange.com/questions/6628/ …mkdir longtitleproject
次に、cd !^