「検索」結果のいずれかを選択し、指定されたアプリケーションで開く方法

「検索」結果のいずれかを選択し、指定されたアプリケーションで開く方法

findme次のコードで呼び出されるbashスクリプトがあります。

#!/bin/bash
locate -Abi '*\.'$1 $2 | grep --color=always -ni $2 | less -R

ファイル名(次の引数を指定)にパターンがあり、指定されたファイル拡張子(スクリプトに指定された最初の引数)を持つすべてのファイルを検索します。
次のコマンドを実行すると:

user@machine$ findme pdf classifi

pdfを含むすべてのファイルを検索します。classifiだから私は次のようなものを得ることができます。

1:/ホーム/ユーザー/Dropbox/SharedWithFriends/数学/分類cations2000.pdf
2:/home/user/Dropbox/SharedWithFriends/math/分類カチオン2010.pdf

問題は次のとおりです。 「次のタスクを自動化するために結果を表示した後、数値とビューアを要求するbashスクリプトコードを提供できますか?」

たとえば、次のように入力すると:

> 2 evince

検索結果の2番目の項目に対してスクリプトが実行されevince2つまり、これが前の検索結果に入力した内容であれば、次のようになります。

evince /home/user/Dropbox/SharedWithFriends/math/classifications2010.pdf

答え1

findmegrepこれは結果を抽出する機能のバリエーションですが、結果に番号を付けたりページを付けたりする代わりに、内部配列からless結果を一覧表示し、プロジェクトとプログラムを選択するように求められます。

#!/usr/bin/env bash

readarray -O 1 -t results < <(locate -Abi '*\.'"$1" "$2" | grep --color=always -i "$2")

for((i=1; i <= ${#results[*]}; i++))
do
  printf "%d: %s\n" $i "${results[i]}"
done
read -p "> " item program
$program "${results[item]}"

ファイル名とgrepパラメータのスペースをよりよく処理するために、元のスクリプトにいくつかの引用符を追加しました。readarray結果がゼロ以外のインデックス1から始まり、grepの番号に対応するように呼び出しを調整しました。

答え2

スクリプトfindmeにはいくつかの問題があります。

  • 変数の置換に二重引用符がありません。
  • の出力は、grep --color=alwaysコマンド置換に使用できない結果を生成します。を渡すために必要ですlessが、スクリプトで再利用しようとしないでください。
  • grepと検索は異なるパターン構文を使用するため、色付けにgrep2番目の引数を使用することは常に機能するわけではありません。-rに渡すとlocate正規表現が使用されますが、Emacs構文はgrepでサポートされている構文とは若干異なります。

Bashでは、次のものを使用できます。mapfile一部の行を配列に確実に埋めます。それを組み合わせるプロセスの交換コマンドの出力を使用します。その後、配列を印刷してユーザーの入力を読み込みます。

findrun () {
  mapfile search_hits <(locate -Abir ".*\.$1" "$2")
  print '%s\n' "${search_hits[@]}" | grep --color=always -ine "$2"
  if read -a cmd; then
    set -- "${cmd[@]}"
    set -- "$@" "${search_hits[$1]}"
    shift
    "$@"
  fi
}

別のインターフェースは、位置パラメーターを設定することです。関数で位置パラメータを変更できないため、これは少し面倒ですが、Bashでロータリー方式でこれを行います。エイリアスを使用してスクリプトをインポートします。引用符に注意してください。

alias findrun='. <(echo findrun_prepare \"\$@\"; echo set -- "\"\${search_hits[@]}\"")'
findrun_prepare () {
  mapfile search_hits <(locate -Abir ".*\.$1" "$2")
  print '%s\n' "${search_hits[@]}" | grep --color=always -ine "$2" >&2
}

使用法:

findrun pdf classifi
evince "$2"

答え3

Jeff Schallerが提供するソリューションに基づいています。解決策を見つけて、より良い改善のためにあなたのフィードバックを喜んで受け入れます。

#!/bin/bash

readarray -O 1 -t results < <(locate -Abi '*\.'"$1" "$2")

for((i=1; i <= ${#results[*]}; i++))
do
  printf "%d: %s" $i "${results[i]}" | grep --color=always -i "$2"
done

read -p "> " item program

$program "${results[item]}"

これは簡単な答えのように見えます(トピックの複雑さによって異なります)。

しかし、結果が特定の数値を超えると十分ではありません!この場合は、次moreのようなものが必要です。less

関連情報