2011-10-18 25 views
22

我必須編寫一個腳本來查找目錄中的所有可執行文件。所以我嘗試了幾種方法來實現它,並且他們實際上工作。但我想知道是否有更好的方法來這樣做。使用ls和grep查找可執行文件

所以這是我的第一種方法:

ls -Fla | grep \*$ 

這工作得很好,因爲-F標誌做的工作對我來說,並增加了每個可執行文件星號,但讓我們說,我不喜歡星號標誌。

因此,這是第二種方法:

ls -la | grep -E ^-.{2}x 

這也工作得很好,我希望有一個破折號作爲第一個字符,然後我不感興趣,在未來兩個字符和第四個字符必須是X 。

但是在需求方面有點不明確,因爲我不知道是否需要檢查用戶,組或其他可執行權限。所以這將工作:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x 

所以我測試的第四,第七和第十個字符是x。現在

我真正的問題,有沒有更好的解決方案使用LS和grep與正則表達式來表示:

我想用grep只有那些文件,具有由生產線的10首第1個字符至少一個X ls -la

+2

感謝您在尋求幫助之前找到某種解決方案。既然你有使用ls和grep的要求,這似乎是一個家庭作業的問題,我看到有人要求作業的答案,而沒有嘗試(或至少沒有描述他們的嘗試)。我知道它差不多4年後,但即便如此,工作也很好。 –

回答

37

你需要使用ls嗎?你可以用find來做同樣的事情:

find . -maxdepth 1 -perm -111 -type f 

會返回當前目錄下的所有可執行文件。刪除-maxdepth標誌以遍歷所有子目錄。

您可以嘗試這種可怕的方式,但它可能會匹配包含類似權限的字符串的文件。

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}" 
+0

是的,我必須使用ls和grep,不過謝謝你 – k13n

35

如果你絕對必須使用ls和grep,這個工程:

ls -Fla | grep '^\S*x\S*' 

它匹配其中的第一個字(非空格)中至少有一個「X」線。

查找是完美的工具。此發現的所有文件(型F)是可執行:

find . -type f -executable 

如果你不希望它遞歸地列出所有可執行文件,使用MAXDEPTH:

find . -maxdepth 1 -type f -executable 
+0

比你的答案和'找到。 -type f -executable'完美運作。但正如我之前所說的,我必須使用ls和grep。我只是想知道是否有一個更聰明的正則表達式的解決方案 – k13n

+0

任何特定的原因?通過ls輸出循環是一個壞主意。 –

+0

好吧,我添加了一個正則表達式,可以做你想做的。 – rmmh

7

也許與測試-x?

for f in $(\ls) ; do test -x $f && echo $f ; done 

\ on ls將繞過shell別名。

+1

AFAICS也會列出目錄。 OP可能會更好... 'for f in $(\ ls);/usr/bin/test -x $ f -a! -d $ f && echo $ f;完成' –

5
for i in `ls -l | awk '{ if ($1 ~ /x/) {print $NF}}'`; do echo `pwd`/$i; done 

這給人以可執行文件的絕對路徑。

-3
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}' 
+0

這個答案出現在低質量的審查隊列中,大概是因爲你沒有提供任何代碼的解釋。如果此代碼回答此問題,請考慮添加一些文字,說明答案中的代碼。這樣,你就更有可能獲得更多讚揚 - 並幫助提問者學習新東西。 – lmo