ディレクトリの作成と移動を同時に行うことができるワンライナーはありますか?

何度も繰り返していることに気づきました:

 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/newsubnewsub内に作成する場合既存のmydirectory。)
  • 引数が-で始まるが、、次にmkdircdはそれをオプションとして解釈します。 -の場合、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/../foofoo。シェルは自身の現在のディレクトリ内のシンボリックリンクも追跡するため、引数でシンボリックリンクを探すだけでは不十分です。そのため、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 を押して前のコマンドラインを呼び出し、編集します。 mkdircdに変更します。

¹ただし、注意してください。 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が提供するコマンドライン編集機能を学習して、別のマシンで作業しているときにカスタムスクリプトが提供する構文上の糖衣構文を見逃さないようにする方がよいと思います。

コメント

回答

使用する場合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] が実行されますmkdirargsは、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でそのようなスクリプトを書くために一日を使いました。
  • 私はあなたが書いたものを試しました。 機能しません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です