Linux의 특정 디렉토리에서 실행 파일 만 찾으려면 어떻게해야합니까?
답변
실행 파일 검사는 (권장 -perm
하지 않음) 또는 -executable
(ACL을 고려하여 권장 됨) 수행 할 수 있습니다 . -executable
옵션 을 사용하려면
find <dir> -executable
검색 가능한 디렉토리가 아닌 실행 파일 만 찾으려면 다음과 결합하십시오 -type f
.
find <dir> -executable -type f
답변
찾기 -perm
옵션을 사용하십시오 . 현재 디렉토리에서 소유자, 그룹 구성원 또는 다른 사람이 실행할 수있는 파일을 찾습니다.
find . -perm /u=x,g=x,o=x
편집하다:
방금 GNU find 4.4.0에있는 다른 옵션을 찾았습니다.
find . -executable
ACL도 고려되기 때문에 더 잘 작동합니다.
답변
나는 그 질문에 리눅스가 특별히 언급되었다는 것을 알고 있지만 Google의 첫 번째 결과이기 때문에 내가 찾고있는 대답을 추가하고 싶었습니다 (예를 들어 당신이 현재 나와 같은 경우 고용주가 GNU 이외의 언어를 사용해야 함) / Linux 시스템).
macOS 10.12.5에서 테스트
find . -perm +111 -type f
답변
실제로 원하는 것은 실행 파일로 무언가를하는 것입니다. 실제로 찾기를 강제로 필터링하지는 않습니다.
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
-executable
플랫폼에 따라 달라지기 때문에 이것을 선호합니다 . 그리고 그것은 -perm
비트 비전, 비트 플랫폼에 따라 다르며 위에 쓰여진 것처럼 파일은 모든 사람 (당신뿐만 아니라)을 위해 실행 가능해야합니다.
(가) -type f
*에 괜찬아 디렉토리에 이동 될 실행 가능해야하고, 쿼리의 이상이에 있기 때문에 중요하다 find
명령, 더 많은 메모리 효율적인 명령이 될 것입니다.
어쨌든 * nix는 10 억 개의 접근 방식의 땅이기 때문에 또 다른 접근 방식을 제공합니다.
답변
실행 파일로 표시된 파일은 실행 파일이거나로드 가능한 파일 또는 객체 일 필요는 없습니다.
내가 사용하는 것은 다음과 같습니다.
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
답변
한 라이너의 팬으로서 …
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
‘xargs’를 사용하여 find 명령에서 출력을 가져옵니다 (공백이있는 파일 이름이 올바르게 처리되도록 print0 사용). 이제 실행 가능한 파일 목록이 있으며 ‘file’명령의 매개 변수로 하나씩 제공합니다. 그런 다음 이진을 무시하려면 ASCII라는 용어를 grep하십시오. find 명령에서-executable을 선호하는 스타일 (이전 답변 참조) 또는 ‘NIX OS에서 작동하는 방식으로 대체하십시오.
루트가 소유 한 스크립트에서 eval이있는 파일을 찾으려면 위의 내용이 필요하므로 루트 사용자가 안전하지 않은 매개 변수로 스크립트를 실행하는 개인 에스컬레이션 취약점을 찾는 데 도움이되도록 다음을 만들었습니다 …
echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
답변
~/.bashrc
오늘 밤에 시스템 경로가 아닌 디렉토리가 아닌 실행 파일을 찾기 위해 함수를 만들었습니다 .
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
장점은 find
명령이 15 분이 걸리는 초 안에 3 개의 Linux 배포판과 Windows 설치를 검색한다는 것 입니다.
예를 들면 다음과 같습니다.
$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate
real 0m0.504s
user 0m0.487s
sys 0m0.018s
또는 전체 디렉토리 및 모든 하위 디렉토리의 경우 :
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s