Bash
查找除某些目錄之外的所有執行檔
我正在尋找所有不在我的
$PATH
.目前我正在這樣做
find / \( -path "/opt" -prune -o -path "/var" -prune -o -path "/bin" -prune -o -path "/sbin" -prune -o -path "/usr" -prune -o -path "/opt" \) -o -type f -executable -exec file {} \;
我覺得有更好的方法,我嘗試使用 for 循環
IFS=:
來分離出不同的部分,PATH
但無法讓它工作。編輯:我應該指定我不想為此使用腳本。
假設 GNU
find
和bash
shell(如問題中使用的那樣),這是一個簡短的腳本,可以完成你想要做的事情:#!/bin/bash IFS=: set -f args=( -false ) for dirpath in $PATH; do args+=( -o -path "$dirpath" ) done find / \( \( "${args[@]}" \) -o \ \( -type d \( ! -executable -o ! -readable \) \) \) -prune -o \ -type f -executable -exec file {} +
這首先創建數組
args
,由動態構造的參數組成find
。它通過拆分$PATH
冒號的值來做到這一點,即我們賦予IFS
變數的值。當我們$PATH
在循環頭中使用 unquoted 時,就會發生拆分。通常,shell 會對從 的拆分生成的每個單詞呼叫文件名萬用字元
$PATH
,但我set -f
用來關閉文件名萬用字元,以防萬一其中的任何目錄路徑$PATH
包含萬用字元(這些仍然是有問題的,因為-path
的操作數find
會將它們解釋為模式)。如果我的
PATH
變數包含字元串/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
然後
args
將是以下列表(這裡的每一行都是數組中的一個單獨元素,這實際上不是一組在它們之間帶有換行符的字元串):-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
命令呼叫中,用括號括起來。沒有必要對-prune
每個目錄都重複,因為你可以像上面一樣使用它一次。我選擇修剪任何不可執行或不可讀的目錄。這應該可以消除您無法訪問或列出其內容的目錄的許多權限錯誤。您想
find
通過刪除此位來簡化命令嗎,請使用find / \( "${args[@]}" \) -prune -o \ -type f -executable -exec file {} +
此外,我正在
file
批量執行找到的路徑名,而不是每個路徑名一次。