![如何使用過濾器運行可執行程序](https://rvso.com/image/38676/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E9%81%8E%E6%BF%BE%E5%99%A8%E9%81%8B%E8%A1%8C%E5%8F%AF%E5%9F%B7%E8%A1%8C%E7%A8%8B%E5%BA%8F.png)
我想運行一個 shell 腳本。這個腳本的名字很長。所以我想對文件使用過濾器。
前任:ls | grep myfile | ./
是否可以執行帶有過濾器的檔案。
答案1
只需輸入:
*myfile*
您也可以這樣做:
"$(ls | grep pattern)"
如果您完整的正規表示式符合而不僅僅是檔案名稱通配符。
所有這些解決方案都假設當前目錄中只有一個檔案與該模式相符。
答案2
您可以使用xargs
對於這類事情:
ls | grep myfile | xargs sh
xargs
讀取其輸入上的行並將它們作為參數提供給作為參數給出的程式:在這裡,它將讀取 grep 的輸出,然後運行sh long_myfile_name
。 (如果您的腳本依賴 Bash 特定功能或其他一些 shell,請更改sh
為)bash
在這個簡單的情況下,您也可以運行sh *myfile*
基本上相同的效果 - 如果您的grep
情況更複雜,您可能無法做到這一點,但sh "$(ls | grep ...)"
會起作用。
也就是說,有一些原因您可能不想這樣做:特別是,如果在某個時候可能有兩個文件與您的grep
.此時將發生以下三件事之一:您的腳本獲得額外的參數,執行兩個不同的腳本,或執行另一個腳本。例如,您可以透過管道來head -n 1
避免前兩個,但隨後將執行任意一個,這沒有多大幫助。在這種$()
情況下,它只會失敗,這可能是一系列糟糕結果中最好的結果。如果檔案名稱中有空格,您就必須更加小心。
shell 的製表符補全可能是更好的選擇:您可以編寫*myfile*
並點擊 TAB 來獲得正確的擴展或指示存在不止一種可能性,或者甚至只是開始寫名稱和製表符補全到最後。如果您在腳本中運行它,只需將全名放在那裡 - 您只需編寫一次。上面的答案會起作用,但我真的不推薦它。
答案3
你可以使用xargs
例如
ls | grep myfile | xargs bash
或使用過濾器find
find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;