
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番目の項目に対してスクリプトが実行されevince
、2
つまり、これが前の検索結果に入力した内容であれば、次のようになります。
evince /home/user/Dropbox/SharedWithFriends/math/classifications2010.pdf
答え1
findme
grep
これは結果を抽出する機能のバリエーションですが、結果に番号を付けたりページを付けたりする代わりに、内部配列から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と検索は異なるパターン構文を使用するため、色付けに
grep
2番目の引数を使用することは常に機能するわけではありません。-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