find
실행 파일을 검색하기 위해 어떤 유형의 매개 변수 / 플래그를 Unix 명령 과 함께 사용할 수 있습니까?
find -executable
... 그러나 이것은 나열된 모든 파일이 실제로 실행된다는 것을 보장하지는 않습니다
find
실행 파일을 검색하기 위해 어떤 유형의 매개 변수 / 플래그를 Unix 명령 과 함께 사용할 수 있습니까?
find -executable
... 그러나 이것은 나열된 모든 파일이 실제로 실행된다는 것을 보장하지는 않습니다
답변:
GNU 버전의 find에서는 다음을 사용할 수 있습니다 -executable
.
find . -type f -executable -print
BSD 버전의 find의 경우 -perm
with +
및 8 진 마스크를 사용할 수 있습니다 .
find . -type f -perm +111 -print
이 문맥에서 "+"는 "이 비트 중 하나라도 설정 됨"을 의미하고 111은 실행 비트입니다.
이것은 -executable
GNU find 의 술어와 동일하지 않습니다 . 특히 -executable
현재 사용자가 파일을 실행할 수 -perm +111
있는지 테스트하고 실행 권한이 설정되어 있는지 테스트합니다.
이전 버전의 GNU find도 -perm +111
구문을 지원 하지만 4.5.12부터이 구문은 더 이상 지원되지 않습니다. 대신을 사용 -perm /111
하여이 동작을 얻을 수 있습니다 .
find: invalid mode ‘+111’
findutils 4.5.11 4.fc20 오류 .
/
대신 +
. 자세한 내용은 업데이트 된 답변을 참조하십시오.
-L
옵션을 : find -L ...
.
-perm +111
얻을 수 오탐 (false positive) 현재 사용자가 실제로 실행할 수없는 즉, 파일을. 파일의 사용자 및 그룹 ID를 현재 사용자의 .NET Framework에 연결 하는 -executable
것이 필요하기 때문에 권한 만 테스트 하여 에뮬레이션 할 방법이 없습니다 .
근본적인 오해를 해소 하기 위해 @ gniourf_gniourf 에게 모자의 팁 .
이 답변 은 기존 답변에 대한 개요 를 제공하고 그 미묘함 과 상대적인 장점 을 논의하고 특히 이식성 과 관련하여 배경 정보 를 제공 하려고 시도 합니다 .
실행 가능한 파일 찾기는 두 가지 다른 사용 사례를 참조 할 수 있습니다 .
에 있습니다 중 하나 의 시나리오는 감각을 만들 수 있습니다 사용하는find -L ...
대신의 find ...
를 위해 또한 찾을 수 에 심볼릭 링크를 실행 .
세 가지 보안 주체 (사용자, 그룹, 기타) 모두에 대해 실행 권한 비트가 설정된 실행 파일을 찾는 가장 간단한 파일 중심 사례는 일반적으로 이지만 반드시 사용자 중심 시나리오와 동일한 결과를 산출 하지는 않습니다. 차이를 이해하는 것이 중요합니다.
-executable
)허용 대답은 commendably 한 권장 -executable
경우, GNU는 find
사용할 수 있습니다.
find
는 대부분의 Linux 배포판
과 함께 제공됩니다.-executable
하는대로 현재 사용자 가 실행할 수있는 파일 만 일치 시킵니다 (특별한 경우가 있습니다. [1] ).BSD find
허용 대답 (가 제공하는 대안은 -perm +111
) 대답 다른 , 파일 -centric 질문 (대답 자체가 상태로).
-perm
대답하는하는 사용자 -centric 질문 것은 불가능 필요한 것은 할 수 있기 때문에, 관련 을 파일의 받는 사용자 및 그룹 ID를 현재 사용자의를 하는 반면, -perm
단지 테스트 할 수 있습니다 파일의 권한을. POSIX 기능find
따라서 최선의 -perm
방법은 (그 자체로)의 근사치 입니다 -executable
. 아마도 더 가까이 근사치보다 -perm +111
입니다-perm -111
이 파업 나 같은 전형적인 실제 시나리오 -, 그래서 모든 보안 사용자 (사용자, 그룹, 기타)의 실행 비트가 설정된 파일을 찾을 수 있습니다. 보너스로 POSIX와 호환됩니다 ( find -L
심볼 링크를 포함 하는 데 사용 합니다. 자세한 설명은 아래 참조).
find . -type f -perm -111 # or: find . -type f -perm -a=x
gniourf_gniourf의 답변 제공 의 진정한 휴대용 상당을-executable
사용하여 -exec test -x {} \;
이기는하지만, 성능을 희생 .
결합 -exec test -x {} \;
으로 -perm +111
(즉, 가진 파일 적어도 하나의 실행 비트 세트) 그 성능 도움이 될 수 exec
없습니다에 대해 호출 할 필요 모든 (다음은 BSD의 발견의 POSIX 호환 상당을 사용하여 파일 -perm +111
/ GNU 찾을 -perm /111
;에 대한 설명은 멀리 아래 참조) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
-perm
)-perm
차 (A로 알려진 시험 GNU의 찾기 용어 참조).
-perm
실행 가능성뿐만 아니라 모든 파일 권한 을 테스트 할 수 있습니다 .111
:) 인 반면 기호 모드는 문자열 (예 :) a=x
입니다.u
(사용자), g
(그룹) 및 o
(기타) 로 식별 하거나 a
세 가지 모두를 나타냅니다. x
예를 들어 권한은 실행 가능한 것으로 표현되며 연산자를 사용하여 주체에 할당됩니다 =
.+
및 -
; A의 진수 모드의 포함 전체 토론, 참조 의 POSIX 사양 chmod
유틸리티를 .find
:
-
(예 :)를 붙이는 것은 지정된 모든 권한 -ug=x
을 가진 파일 일치를 의미 합니다 (하지만 일치하는 파일에는 추가 권한이있을 수 있음).755
없다는 의미 (예 :) 는이 완전하고 정확한 권한 집합 을 가진 파일과 일치 함을 의미합니다 .+
/
[2]파일 중심 명령 예
노트 :
+
또는 /
.!
NOT (GNU 찾기 및 BSD 찾기도 허용 -not
) 참고 \!
예제에서 사용됩니다 않도록 보호 !
쉘 히스토리 확장에서-a
AND 용 (GNU 찾기 및 BSD 찾기도 허용 -and
)-o
OR 용 (GNU 찾기 및 BSD 찾기도 허용 -or
)-
를 사용하면 =
및 +
연산자를 같은 의미로 사용할 수 있습니다 (예 : 적용하지 않는 한- -u=x
와 동일).-u+x
-x
나중에 하지만 그렇게 할 필요가 없습니다).,
부분 모드를 결합하는 데 사용 합니다. AND 논리가 내포되어 있습니다. 예를 들어, -u=x,g=x
사용자 와 그룹 실행 가능 비트가 모두 설정되어야 함을 의미합니다.-perm
NOT 기본과 함께 별도의 표현식을 사용해야합니다 !
.-print
, 또는 -perm
; GNU find에서 작업 및 테스트 라고도 함 )은 암시 적 으로 -a
(논리 AND) -o
및 괄호 (로 이스케이프 됨)와 결합됩니다.\(
및 \)
쉘에 대한)을 구현 OR 논리 필요하다.find -L ...
대신 심볼릭 링크를find ...
일치시키기 위해 사용 됩니다. 실행 파일
-L
symlink 자체 대신 symlink 의 대상 을 평가하도록 find를 지시 합니다. 따라서없이 -L
, -type f
모두 심볼릭 링크를 무시합니다.# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1]의 설명 -executable
에서 man find
GNU의로 4.4.2을 찾기 :
실행 가능한 파일과 검색 가능한 디렉토리를 찾습니다 (파일 이름 확인 의미에서). 이는 -perm 테스트가 무시하는 액세스 제어 목록 및 기타 권한 아티팩트를 고려합니다. 이 테스트는 access (2) 시스템 호출을 사용하므로 UID 매핑 (또는 루트 스 쿼싱)을 수행하는 NFS 서버가 속일 수 있습니다. 많은 시스템이 클라이언트의 커널에서 access (2)를 구현하므로 사용할 수 없기 때문입니다. 서버에 보관 된 UID 매핑 정보. 이 테스트는 access (2) 시스템 호출의 결과만을 기반으로하기 때문에이 테스트가 성공한 파일이 실제로 실행될 수 있다는 보장은 없습니다.
[2] GNU find 4.5.12 이전 버전 도 prefix를 허용 +
했지만, 이것은 처음에는 더 이상 사용되지 않고 결국 제거되었습니다. 기호 모드 +
와 결합 하면 정확한 권한 마스크 로 해석되어 예상치 못한 결과가 나올 가능성이 있기 때문 입니다. 경우 당신의 (a)는 버전에서 실행 하기 전에 4.5.12 및 (B)가 자신을 제한 진수 모드에만, 당신은 할 수 사용으로 도망 +
하여 모두 GNU 찾아 BSD의 발견,하지만 그것은 좋은 생각이 아니다.
따라서 현재 사용자가 실행할 수있는 파일을 찾을 수 있는 또 다른 가능성 1 이 있습니다.
find . -type f -exec test -x {} \; -print
(여기서 테스트 명령은 PATH에서 찾은 명령이며 /usr/bin/test
내장이 아닌)입니다.
1-executable
플래그를 find
사용할 수없는 경우에만 사용하십시오 ! 이것은 -perm +111
솔루션 과 미묘하게 다릅니다 .
'{}'
또는 \{\}
.
-executable
또는 내 명령 처럼 실행 가능한 명령을 찾지 않습니다.
find . -type f -perm -u=x
는 다음 과 동일 하지 않습니다 . 내가 적절한 그룹에 속해 있거나 . 실제로 사용자가 실행할 수없는 많은 파일을 찾고 해당 사용자가 실행할 수있는 파일을 놓칠 것입니다. " -executable
-executable
g+x
o+x
-perm -u=x
{}
인용을해야하는 것은 가상의 필요성 이지만 실제로는 POSIX와 같은 쉘과 csh
. 이 어디에 당신은 껍질을 아십니까 되어 필요?
fish
, {}
정말 하나 같이 이스케이프해야합니다 '{}'
나 \{\}
. 그 주 bash
, ksh
및 zsh
중괄호 확장 같은 종류의를 제공한다; 그러나, 그들은 인용되지 않은 토큰을 인쇄하지 {}
이기 때문에 (따라서 및 : 탈출에 대한 필요성을), 그들은 그것을 고려하지 않기 때문에 유효 중괄호 식을 (그들은 적어도 필요 2 , 토큰, 또는 유효한 숫자 시퀀스 표현) 반면 fish
하다고 유효 중괄호 빈 문자열이 되는 표현식입니다 . {}
-executable
테스트 플래그를 사용할 수 있습니다 .
-executable
Matches files which are executable and directories which are
searchable (in a file name resolution sense).
-rw-r-xr-x
있는 -executable
감지하지 않습니다
이것은 나를 위해 일했고 공유를 생각했습니다 ...
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
file
!
find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
find . -executable -type f
실제로 파일이 실행 가능하다는 것을 보장하지 않고 실행 비트가 설정된 파일을 찾습니다. 만약 당신이
chmod a+x image.jpg
위의 발견은 image.jpg가 실제로 실행 비트가 설정된 jpeg 이미지라도 실행 가능하다고 생각합니다.
나는 일반적으로 이것으로 문제를 해결합니다.
find . -type f -executable -exec file {} \; | grep -wE "executable|shared object|ELF|script|a\.out|ASCII text"
찾기에서 실행 파일에 대한 돔 정보를 실제로 인쇄하려면 다음과 같이 할 수 있습니다.
find . -type f -executable -printf "%i.%D %s %m %U %G %C@ %p" 2>/dev/null |while read LINE
do
NAME=$(awk '{print $NF}' <<< $LINE)
file -b $NAME |grep -qEw "executable|shared object|ELF|script|a\.out|ASCII text" && echo $LINE
done
위의 예에서 파일의 전체 경로 이름은 마지막 필드에 있으며 파일 이름이 다른 곳에있는 경우 awk "NAME = $ (awk '{print $ NF}'<<< $ LINE)"을 사용하여 찾는 위치를 반영해야합니다. "NF"를 올바른 숫자 위치로 바꾸는 데 필요한 출력 문자열 찾기. 구분 기호가 공백이 아닌 경우 구분 기호가 무엇인지 awk에 알려야합니다.
이것이 불가능에 가까운 것은 말할 것도없고 매우 쉬운 일이 아니라는 것은 너무 어리석은 일 입니다 . 손 들어, 나는 Apple / Spotlight를 연기한다 ...
mdfind 'kMDItemContentType=public.unix-executable'
적어도 작동합니다!
mdfind
OSX 에 대해 알아두면 좋습니다 . uour 명령은 전체 시스템에 대한 Unix 실행 파일을보고 합니다 . mdfind -onlyin . 'kMDItemContentType=public.unix-executable'
결과를 현재 디렉토리의 하위 트리로 제한합니다. 사소한 관심 지점 : 검색을 특정 디렉토리 (하위 폴더없이)로만 제한하는 것은 분명히 지원되지 않습니다. 실행 파일에 대한 심볼릭 링크 는 분명히 포함되지 않습니다. 흥미롭게도 mdfind
실행 가능한 파일을 찾으면 이후 에 실행 가능한 비트를 제거 하는 것은 선택 되지 않습니다 .
mdfind -onlyin . 'kMDItemContentType=public.unix-executable'
과 같은 동작합니다 find . -type f -perm +111 -print
않습니다. 즉, 함께 파일을 발견입니다 어느 얻을 수 있습니다 실행 비트 세트, 가양 성 (즉, 실제로 문제가되지 않을 수도 있지만) - 진정 단지에 의해 실행 파일을 찾을 수에 현재 사용자 , BSD 찾기를 사용하여 @ gniourf_gniourf의 답변을 참조하십시오. find
기반 솔루션을 사용하면 실행 파일에 대한 심볼릭 링크도 찾을 수 있다는 장점이 있습니다 (옵션 -L
) mdfind
.
zsh
팁을 주셔서 감사합니다 -몰랐습니다. ( 실행 파일 ( ) 또는 심볼릭 링크 ( ) 중 하나 와 일치 할 수 있지만 둘 다 일치 하지는 않는 것 같습니다 .) 원래 요점에 관해서는 : 다시 말씀 드리겠습니다 . 더 많은 유연성을 제공하면서 명령 이 수행하는 작업을 수행 합니다. POSIX를 준수하도록 재구성 할 수도 있습니다. *
@
find . -type f -perm +a=x
mdfind
쉬운 대답은 "실행 파일이 PATH 변수에 포함 된 디렉토리에 있습니다."이지만 실제로는 실행 파일을 찾지 못하며 어쨌든 많은 실행 파일을 놓칠 수 있습니다.
나는 Mac에 대해 잘 모르지만 "mdfind 'kMDItemContentType = public.unix-executable'"이 해석 된 스크립트와 같은 것을 놓칠 수 있다고 생각합니다.
실행 가능한 비트가 설정된 파일을 찾는 것이 괜찮다면 (실제로 실행 가능한지 여부에 관계없이) 다음을 수행하는 것이 좋습니다.
find . -type f -perm +111 -print
지원되는 경우 "-executable"옵션은 acl 및 기타 권한 아티팩트를 보는 추가 필터를 만들지 만 기술적으로는 "-pemr +111"과 크게 다르지 않습니다.
아마도 앞으로 find는 "-magic"을 지원할 것이고 특정 매직 ID를 가진 파일을 명시 적으로 찾을 수있게 해줄 것입니다.하지만 그런 다음 모든 실행 가능한 형식 magic id를 정밀하게 지정해야합니다.
나는 유닉스에서 기술적으로 올바른 쉬운 방법을 알지 못합니다.
따라서 실행 권한이있는 파일뿐만 아니라 실행 파일 유형 (예 : 스크립트, ELF 바이너리 등)을 실제로 찾고자한다면 다음과 같은 작업을 수행하고 싶을 것입니다 (현재 디렉토리. 원하는 디렉토리) :
gfind . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print
또는 macports (리눅스 사용자)를 사용하지 않거나 원하는대로 gnu find를 설치 한 경우 :
find . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print
OS X를 사용하는 경우 기본적으로 작은 테스트를 번들로 제공하는 is_exec라는 어딘가에 숨겨진 유틸리티가 제공되므로 찾으면 명령 줄을 줄일 수 있습니다. 그러나이 방법은 == test를 = ~ test로 쉽게 바꾸고 실행 가능한 일반 텍스트 파일이나 파일 명령이 반환하는 다른 정보와 같은 더 복잡한 속성을 확인하는 데 사용할 수 있으므로 더 유연합니다.
여기 인용에 대한 정확한 규칙은 매우 불투명하므로 시행 착오를 거쳐 결국 작업을 끝내지 만 올바른 설명을 듣고 싶습니다.
나는 같은 문제가 있었고 그 대답은 dmenu 소스 코드 에있었습니다. 그 목적을 위해 만들어진 stest 유틸리티입니다. 'stest.c'및 'arg.h'파일을 컴파일하면 작동합니다. 편의를 위해 거기에 넣은 사용법에 대한 man 페이지가 있습니다.
STEST(1) General Commands Manual STEST(1)
NAME
stest - filter a list of files by properties
SYNOPSIS
stest [-abcdefghlpqrsuwx] [-n file] [-o file]
[file...]
DESCRIPTION
stest takes a list of files and filters by the
files' properties, analogous to test(1). Files
which pass all tests are printed to stdout. If no
files are given, stest reads files from stdin.
OPTIONS
-a Test hidden files.
-b Test that files are block specials.
-c Test that files are character specials.
-d Test that files are directories.
-e Test that files exist.
-f Test that files are regular files.
-g Test that files have their set-group-ID
flag set.
-h Test that files are symbolic links.
-l Test the contents of a directory given as
an argument.
-n file
Test that files are newer than file.
-o file
Test that files are older than file.
-p Test that files are named pipes.
-q No files are printed, only the exit status
is returned.
-r Test that files are readable.
-s Test that files are not empty.
-u Test that files have their set-user-ID flag
set.
-v Invert the sense of tests, only failing
files pass.
-w Test that files are writable.
-x Test that files are executable.
EXIT STATUS
0 At least one file passed all tests.
1 No files passed all tests.
2 An error occurred.
SEE ALSO
dmenu(1), test(1)
dmenu-4.6 STEST(1)