コンテキスト
私がいるディレクトリには3つのフォルダがあります。実行後のls -1
順序は次のとおりです。
folder1
folder2
folder3
cd
早く入りたいですfolder2
。
cd
すぐに関数を書くことができましたfolder1
それは私の責任です。
f1 () {
cd $(ls -d */|head -n 1)
}
質問
という関数が必要ですf2
。実行するとcd
sが入力されますfolder2
。
(フォルダはでソートされますls -1
。私はを使用していますzsh
)
答え1
Shell globはデフォルトでアルファベット順にソートされており、Zshではglobの結果の直接索引付けが可能になるため、次のことができます。
cd2() {
cd -- */([2]); # indexing starts at one
}
Bashでは、配列を使用して同じことを実行できます。
cd2() {
local dirs=(*/)
cd -- "${dirs[1]}" # indexing starts at zero
}
両方とも、本質的に少なくとも2つのグローバルマッチングがあると仮定する。バラよりコサロナンダの答えこの仮定を扱う方法を学びなさい。
また、ls
別名を使用してフラグを立てると、ソート順がシェルのソート順と異なる場合があります。 (私はLinuxでエイリアスを使用し、並びls
替え順序も変更しました。)もちろん、Zshは他のさまざまな並べ替えオプションも提供します。ls -vF --color=auto
-v
a
_
参考にしてください。あなたはできますls | head -2 | tail -1
出力リストから2番目のファイル名を取得するのと同じ方法を使用してくださいls
。これは改行文字を含むファイル名には機能せず、シェルがそれ自体で実行できる操作を実行するには1つではなく3つの外部プロセスが必要なため、これはあまり良い解決策ではありません。 。ls */
もっと愚かなのはここにあるからシェルglobを展開し、受け取ったls
名前だけを印刷します。バラよりhttps://mywiki.wooledge.org/ParsingLs依存関係出力でls
発生する可能性のある問題の詳細をご覧ください。
答え2
を使用すると、zsh
次の内容がcd
現在のディレクトリ内の2番目のディレクトリに移動します。
cd ./*(/[2])
/
角かっこ内にはglobの修飾子があり、ディレクトリ名のみを一致させ*
(マニュアルを参照zshexpn
)、[2]
このglobに一致する2番目のディレクトリを抽出します。
関数で包みます。
cd2nd () { cd ./*(/[2]); }
現在のディレクトリに2番目のディレクトリがない場合は、ホームディレクトリに移動します。 2番目のディレクトリが存在するかどうかを最初にテストしてこれを防ぐことができます。
cd2nd () { [ -d ./*(/[2]) ] && cd ./*(/[2]); }
しかし、今モデルを拡張してみましょう。二重。
/bin/sh
(または)にはzsh
グローバル一致が1つだけあります。
cd2nd () { set -- ./*/; [ -d "$2" ] && cd "$2"; }
これは、位置引数を使用してすべてのサブディレクトリ名(一致するディレクトリのみ)を保存し、*/
2番目のサブディレクトリがあるかどうかをテストし、存在する場合はそのディレクトリを変更します。
答え3
引数と引数を変更する必要があるディレクトリ番号を受け入れる関数
function ff()
{
cd "$(ls -d */ | head -n $1 | tail -n 1)";
}
使用法:
user@localhost:~ $ ff 2
user@localhost:~/Desktop $
説明する:
ls -d */
現在のディレクトリの下のすべてのディレクトリを一覧表示head -n $1
最初のディレクトリだけが$1
リストされ$1
、関数引数であるため、それを呼び出すcc 2
と$1
値が取得されます2
(最初の2行は現在処理中です)。tail -n 1
最後の行のみを選択- これらはすべて
cd
コマンドとして送信されるため、ディレクトリは正しいディレクトリに変更されます(引用符があるため、空白のあるディレクトリ名は引数として解析されます)。
警告する!
このバージョンでは、入力に問題がないと仮定します。将来の予期しないエラーを回避するには、入力(ユーザーおよびファイルシステムディレクトリのリストから)を確認する必要があります。