ターミナルを使ってファイルを検索してクリックすると、好きなプログラムで開くことができますか?

ターミナルを使ってファイルを検索してクリックすると、好きなプログラムで開くことができますか?

ファイルを検索するときに見つけた検索結果から、端末内のファイルへのリンクを何とか生成したいと思います。ターミナル内でハイパーリンクをクリックするのと同じですが、この場合はURLではなくファイルになります。可能ですか?

以下は私が使用するコマンドです。

grep -rnw "$2" -e "$1"

...これは私のログから「filezilla」という用語を検索したときのスクリーンショットです。

ここに画像の説明を入力してください。

紫色のテキストをクリックできるようにしたいので、端末でハイパーリンクを開くときと同じように、正確なファイルの場所です。

以下のコマンドを試しましたが、基本プログラム(この場合はマウスパッド)を介して見つかったすべての検索結果が自動的に開きます。

grep -rnw "$2" -e "$1" | xargs mousepad

答え1

最新の端末エミュレータは、限られた範囲でハイパーリンクを処理します。文書を開くために使用するプログラムを「知っている」場合、正しいプロトコルがstdout前に付けたファイル名を端末ウィンドウに表示できます。私たちはローカルファイルを扱っているので、これは変更を意味します。

/path/to/file/this.doc

到着

file:///path/to/file/this.doc

ハイパーリンクに似ていますが、ドメイン名はありません。シェルがファイルの種類を開く方法を知っている場合は、そうします。

for i in $(ls); do echo "file://$(pwd)/$i"; done

ctrl+click

編集する

コメントと回答で@tripleeeの大きな改善をもたらすには...

printf "file://$(pwd)/%s\n" *

編集終了

ファイル名にスペースが含まれるファイルには機能しません。拡張すると、$(ls)スペースで区切られたファイル名のリストが生成されるためです。スペース以内にファイル名は、シェルが実際にスペースで区切られた2つのファイル名であると考えるようにします。

my file.pdf

~になる

my
file.pdf

ファイル名にスペースが含まれている場合は、よりエレガントな解決策が見つかるまでこの方法を試してください。次の質問のためにハッキングするだけです... ;-)

for f in $(find . -type f -maxdepth 1 -iname "*" | sed 's/ /%20/g'); do echo "file://$(pwd)/${f#*/}"; done

find目的のファイルを再取得するには、通常の方法で使用してください。

関連情報