查找除某些目錄以外的所有可執(zhí)行文件
我正在查找不在我的$PATH中的所有可執(zhí)行文件。當(dāng)前我正在執(zhí)行此操作find/\(-PATHquot;-prune-o-PATHquot;-prune-o-PATHquot;-prune-o-PATHquot;-prune-o-PA
解答動態(tài)
假設(shè)GNU find和bash shell(如問題中所用),這是一個(gè)簡短的腳本可以完成你想要做的事情:
#!/bin/bashIFS=:set-fargs=(-false)表示$PATH中的dirpath;do args+=(-o-PATHquot;)donefind/\(\(quot;\)-o\(-type d\(!-可執(zhí)行文件-哦!-readable \)\)\)\)-prune-o \-type f-executable-exec file{}+ 首先創(chuàng)建數(shù)組參數(shù),由要查找的動態(tài)構(gòu)造的參數(shù)組成。它通過在冒號上拆分$PATH的值來實(shí)現(xiàn),這個(gè)值是我們給IFS變量的值。當(dāng)我們在循環(huán)頭中使用$PATH unquoted時(shí),就會發(fā)生拆分。
通常,shell會在拆分$PATH生成的每個(gè)單詞上調(diào)用filename globbing,但我使用set-f來關(guān)閉filename globbing,以防$PATH中的任何目錄路徑包含globbing字符(由于find的-PATH操作數(shù)會將它們解釋為模式,因此這些字符仍然是有問題的)。
如果my PATH變量包含string
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin 則args將是以下列表(每行數(shù)組中有一個(gè)單獨(dú)的元素,這實(shí)際上不是一組在它們之間帶有換行符的字符串):
-false-o-path/usr/bin-o-path/bin-o-path/usr/sbin-o-path/sbin-o-path/usr/X11R6/bin-o-path/usr/local/bin-o-path/usr/local/sbin 此列表插入到find命令調(diào)用中的括號中。沒有必要對每個(gè)目錄都進(jìn)行重復(fù)修剪,因?yàn)槟梢韵裆厦嬉粯又皇褂靡淮巍τ跓o法訪問或列出其內(nèi)容的目錄,這應(yīng)該可以消除很多權(quán)限錯(cuò)誤。要通過刪除此位來簡化find命令嗎,請使用
find/\(quot;\)-prune-o \-type f-executable-exec file{}+ 此外,我正在批處理找到的路徑名上運(yùn)行文件,而不是對每個(gè)路徑名運(yùn)行一次,您可以這樣做:
set-o extendedglobLC_ALL=C find/-regextype egrep \-regex${(j[])${(u)路徑:P}//(#m)[.\$^*()+{}\\\\
.]/\$MATCH}-prune-o \-type f-executable-exec file{}+$path是一個(gè)綁定到$path env var的特殊數(shù)組$路徑:P獲取每個(gè)成員${(u)array}的realpath(絕對的,規(guī)范的,沒有符號鏈接)刪除重復(fù)的(這里是規(guī)范化后)${array//(#m)pattern/\\$MATCH}在任何與模式匹配的元素(這里是所有的egrep regexp操作符)${(j[
])array}將數(shù)組的元素與
連接以獲得/dir
/dir\.2
。。。正則表達(dá)式。
- End
免責(zé)聲明:
本頁內(nèi)容僅代表作者本人意見,若因此產(chǎn)生任何糾紛由作者本人負(fù)責(zé),概與琴島網(wǎng)公司無關(guān)。本頁內(nèi)容僅供參考,請您根據(jù)自身實(shí)際情況謹(jǐn)慎操作。尤其涉及您或第三方利益等事項(xiàng),請咨詢專業(yè)人士處理。