나는 내 것이 아닌 것을 찾고 있습니다 $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 {} \;
IFS=:
더 좋은 방법이 있다고 생각합니다. for 루프를 사용하여 여러 부분을 분리 하려고 시도했지만 PATH
제대로 작동하지 못했습니다.
편집: 이에 대해 스크립트를 사용하고 싶지 않다고 지정해야 합니다.
답변1
GNU find
와 bash
(질문에 사용된) 쉘을 가정하면 다음은 원하는 작업을 수행하는 짧은 스크립트입니다.
#!/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
루프 헤더에 인용되지 않은 내용을 사용할 때 분할이 발생합니다.
일반적으로 쉘은 분할에 의해 생성된 각 단어에 대해 파일 이름 globbing을 호출 $PATH
하지만 set -f
디렉토리 경로에 와일드카드 문자가 포함된 경우를 대비하여 파일 이름 globbing을 사용했습니다( 피연산자가 이를 패턴으로 해석하기 $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
각 경로명을 한 번 실행하는 대신 찾은 경로명을 일괄적으로 실행합니다.
답변2
이를 통해 zsh
다음을 수행할 수 있습니다.
set -o extendedglob
LC_ALL=C find / -regextype egrep \
-regex ${(j[|])${(u)path:P}//(#m)[][.\$^*()+{}\\|.]/\\$MATCH} -prune -o \
-type f -executable -exec file {} +
$path
특별한 배열이다묶음$PATH
환경 변수 에 .$path:P
각 멤버의 실제 경로를 가져옵니다(절대, 표준, 심볼릭 링크되지 않음).${(u)array}
중복 제거(정규화 후)${array//(#m)pattern/\\$MATCH}
\
일치하는 항목 앞에 를 추가하세요pattern
(여기에는 모든 egrep 정규 표현식 연산자가 있습니다).${(j[|])array}
배열의 요소를 연결하여 정규식을|
얻습니다 ./dir|/dir\.2|...