シェルスクリプトを実行したいです。このスクリプトの名前は非常に長いです。だから、ファイルにフィルタを使用したいと思います。
前任者: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 ./'{}' \;