Bash

查找除某些目錄之外的所有執行檔

  • February 24, 2021

我正在尋找所有不在我的$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但無法讓它工作。

編輯:我應該指定我不想為此使用腳本。

假設 GNUfindbashshell(如問題中使用的那樣),這是一個簡短的腳本,可以完成你想要做的事情:

#!/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批量執行找到的路徑名,而不是每個路徑名一次。

引用自:https://unix.stackexchange.com/questions/636204