フィルタを使用して実行可能プログラムを実行する方法

フィルタを使用して実行可能プログラムを実行する方法

シェルスクリプトを実行したいです。このスクリプトの名前は非常に長いです。だから、ファイルにフィルタを使用したいと思います。

前任者:ls | grep myfile | ./

フィルタを使用してファイルを実行できますか?

答え1

以下を入力してください。

*myfile*

次のようにすることもできます。

"$(ls | grep pattern)"

ファイル名ワイルドカードだけでなく、完全正規表現と一致する場合。

これらのソリューションのすべては、現在のディレクトリにパターンに一致するファイルが1つしかないと想定しています。

答え2

あなたはそれを使用することができますxargsこの種の場合:

ls | grep myfile | xargs sh

xargs入力の行を読み取り、それを引数として提供されたプログラムに引数として提供します。ここではgrepの出力を読み、実行しますsh long_myfile_name。 (スクリプトがBash固有の機能や他のシェルに依存している場合は、sh次のように変更してください)bash

この単純な場合でも、sh *myfile*基本的に同じ効果を実行できます。grepケースがより複雑な場合は、これを行うことはできませんが、うまくsh "$(ls | grep ...)"いきます。


つまり、これをしたくない理由はいくつかあります。特に、ある時点で2つのファイルがある場合は、この時点で3つのうちの1つが発生します。スクリプトが追加の引数を取得grepして2つの異なるスクリプトを実行するします。 、または他のスクリプトを実行してください。たとえば、パイピングで最初の2つを避けることができますが、これはhead -n 1どちらかが実行されるため、あまり役に立ちません。この$()場合は失敗するだけです。これはおそらく一連の悪い結果の中で最高の結果です。ファイル名にスペースが含まれている場合は、さらに注意が必要です。

シェルのタブの完成がより良いオプションかもしれません。*myfile*TAB を入力して押して正しい拡張を得るか、複数の可能性があることを示すか、名前とタブの完成を最後まで書き始めることもできます。スクリプトで実行している場合は、フルネームをそこに入力するだけです。一度だけ書くだけです。上記の答えはうまくいきますが、実際にはお勧めできません。

答え3

xargsたとえば、次のものを使用できます。

ls | grep myfile | xargs bash

またはフィルタを使用してくださいfind

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;

関連情報