尋ねる
私はバッシュを使います。ファイルを見つけるときは、通常、次のことを行います。
find -name stackexchange.hs
結果は一般的に次のようになります。
/youre/the/man/now/dog/stackexchange.hs
/you/are/no/longer/the/dog/dog/stackexchange.hs
/this/is/the/file/i/want/stackexchange.hs
その後、次のいずれかを実行したいと思います。
- オプション1:結果リストの最後の項目を開くウィム。
- オプション2:結果リストでN番目の項目を開くウィム。
現在は切り取りと貼り付けにマウスを使用しています。これは私の記憶を思い出させます。質問:
- オプション1と2を実行する簡単な1行方法はありますか?こんなことが起きているので参考にしてください後ろに注文する
find
。 - 一種のbashベクトル/配列でstdoutからN行をキャプチャする方法はありますか?
理想的な使用
$ find -name am_i_really_all_alone.txt
./borges/library/you_are_not_alone.txt
./borges/library/am_i_really_all_alone.txt
$ vim (N)
(構文と意味は異なる場合がありますが、アイデアを得ることができます)
類似点
同様の質問がいくつかあるようです。これは私のものです。認識された違い(私はインスピレーションを受けることができます):
- 「検出されたファイルを開くには find コマンドを使用します」ファイル名をパイプ
find
(vim
または何でも)にパイプする1行ファイルの作成に焦点を当てます。私の場合は、最初に送信し、後で送信したいと思いますfind
(言えば)。私のキャプチャ/使用は厳密に次のとおりです後ろに。 - 「Lindコマンドの最後の出力を再利用します。」ビューには良いですが、コマンドだけを繰り返すようで、キャプチャについては言及しません。N番目出力ライン。正直怖いです。
- 「Bashの内蔵マルチライン出力キャプチャ」近いですが十分ではありません。
- 「ターミナル、シェル、tty、コンソールなどの正確な違いは何ですか?」この本は確かに読みやすい本です。
ご協力ありがとうございます!私が90年代の10代だったときに* nix / BSDを使用しましたが、疲れて気分が悪い隣人がプラグアンドプレイサウンドカード用のドライバをインストールするのを手伝ってくれたので、コマンドについて話し合ってうれしかったです。 - 詳細を(明らかに)あまり怖い個人に関連付けます。また帰ってきて気分が良すぎます。
ベストアンサー1
これはあなたの問題に対する潜在的な解決策です合理的にファンキーなファイル名があっても(完全ではありませんが)安全です(改行文字を含むファイル名を処理しません。おそらく変更できますが、他の問題は隠れている可能性があります)。
2つの関数のうち最初の関数は渡された引数find
で実行され、出力を配列に保存して表示します。 2番目は配列にアクセスするためのヘルパーです。
myfind() {
IFS=$'\n' __last_find_result=($(find "$@"));
printf "%s\n" "${__last_find_result[@]}";
}
myget() {
echo "${__last_find_result[$1]}";
}
ユースケース:
$ myfind . -name "c*"
./a b/c d
./.git/config
./.git/hooks/commit-msg.sample
$ vim "$(myget 0)"
# This opens the "./a b/c d" file.
$ vim "$(myget 2)"
# This opens ".git/hooks/commit-msg.sample"
$(myget index)
ファイル名にスペースやその他の問題になる文字が含まれていない場合は、周囲の引用符は必要ありません。
出力全体をfind
ユーザー環境にプッシュします。これは制限される可能性があります。 (配列の代わりに一時ファイルを使用するとこの問題は解決されますが、他の問題があります。特に複数のシェルを同時に使用する場合があります。)