![フィルター付き実行可能プログラムを実行する方法](https://rvso.com/image/38676/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E4%BB%98%E3%81%8D%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
シェル スクリプトを実行したいのですが、このスクリプトの名前は長いです。そのため、ファイルにフィルターを使用したいと思います。
元:ls | grep myfile | ./
フィルター付きのファイルを実行することは可能ですか。
答え1
次のように入力してください:
*myfile*
以下のこともできます:
"$(ls | grep pattern)"
ファイル名のワイルドカードだけでなく、完全な正規表現マッチングを行う場合。
これらのソリューションはすべて、現在のディレクトリにパターンに一致するファイルが 1 つだけあることを前提としています。
答え2
使用できますxargs
このような場合:
ls | grep myfile | xargs sh
xargs
入力の行を読み取り、引数として指定されたプログラムに引数として渡します。ここでは、grep の出力を読み取り、 を実行します。(スクリプトが Bash 固有の機能や他のシェルに依存している場合はにsh long_myfile_name
変更します)sh
bash
sh *myfile*
この単純なケースでは、基本的に同じ効果で実行することもできます。grep
より複雑な場合は、それができない可能性がありますが、sh "$(ls | grep ...)"
機能します。
そうは言っても、これを実行したくない理由がいくつかあります。特に、ある時点で に一致するファイルが 2 つ存在する可能性がある場合ですgrep
。その時点では、スクリプトに追加の引数が渡される、2 つの異なるスクリプトが実行される、または代わりに別のスクリプトが実行される、という 3 つのうちのいずれかが発生します。たとえば、head -n 1
最初の 2 つを回避するためにパイプを使用することもできますが、その場合、任意のスクリプトが実行されることになり、あまり役に立ちません。その$()
場合は失敗するだけであり、これはおそらく一連の悪い結果の中では最善の結果です。ファイル名にスペースがある場合は、さらに注意する必要があります。
シェルのタブ補完の方が良い選択肢かもしれません。入力*myfile*
して TAB キーを押すと、正しい展開または複数の可能性があることを示す表示が得られる可能性があります。または、名前の入力を開始してタブ補完することもできます。これをスクリプトで実行する場合は、フルネームをそこに入力するだけです。入力するのは 1 回だけです。行の上の回答でも機能しますが、あまりお勧めしません。
答え3
例えばxargs
ls | grep myfile | xargs bash
またはフィルターを使用してfind
find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;