尋ねる

尋ねる

尋ねる

私はバッシュを使います。ファイルを見つけるときは、通常、次のことを行います。

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. オプション1と2を実行する簡単な1行方法はありますか?こんなことが起きているので参考にしてください後ろに注文するfind
  2. 一種の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)

(構文と意味は異なる場合がありますが、アイデアを得ることができます)

類似点

同様の質問がいくつかあるようです。これは私のものです。認識された違い(私はインスピレーションを受けることができます):

ご協力ありがとうございます!私が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ユーザー環境にプッシュします。これは制限される可能性があります。 (配列の代わりに一時ファイルを使用するとこの問題は解決されますが、他の問題があります。特に複数のシェルを同時に使用する場合があります。)

おすすめ記事