특정 shebang 줄이 포함된 모든 스크립트를 찾고 싶습니다. 특히 다음 기준과 일치하는 모든 파일을 원합니다.
- 대부분 일반 텍스트 파일입니다(
gzexe
매우 친숙해 보이지 않는 파일 생성). - 첫 번째 줄에는
#!/bin/sh
or#! /bin/sh
(공백 포함) 만 포함됩니다.
find
, sed
및 grep
( 사용 가능)을 사용하여 file
이 작업을 수행하고 싶습니다 .
일부 스크립트에는 확장자가 없거나 잘못된 확장자가 있기 때문에 파일 이름은 쓸모가 없습니다. 또한 제가 원하는 내용이 아닌 something.sh
shebang 라인이 있을 수도 있습니다 .#!/bin/bash
또한 가끔 다음과 같은 파일을 접할 때도 있습니다.
#!/bin/sh 잠깐만 잠깐만 잠깐만...
라인 1은 비어 있고 shebang은 라인 2에 있습니다.내가 원하는 건 아니야.
Shebang 라인을 찾을 수 있지만 find|grep
라인을 찾는 방법을 모르겠습니다특히 첫줄에파일의.
미리 도움을 주셔서 감사합니다.
답변1
GNU grep이 있는 경우
grep -rIzl '^#![[:blank:]]*/bin/sh' ./
답변2
여러 답변을 내 버전에 병합했습니다.
find -type f -exec \
sh -c 'head -n1 "$1" | grep -q "^#![[:blank:]]*/bin/sh"' _ {} \; \
-print
- 이는 뉴런에서 가져와
find -type f -exec
모든 파일을 가져오고 해당 파일에 대한 명령을 실행하는 데 사용됩니다. - user218374에서 가져온 것으로,
head -n1
첫 번째 행만 가져오고grep -q
RC만 가져오는 데 사용됩니다. [[:blank:]]*
Costas에서 가져온 것으로 공백과 탭을 처리하는 데 사용됩니다 .- from 뉴런을 사용하지 말고 대신
echo
find-print
명령을 사용하십시오.
답변3
#!/bin/sh
파일에 어떤 줄이 나타나는지 신경 쓰지 않으면 다음을 시도해 볼 수 있습니다.
find -type f -exec bash -c 'grep -r "^#!.*\/bin\/sh" $1 1> /dev/null && echo $1' _ {} \;
답변4
+x
권한(예: ) 또는 shebang 에 관계없이 다양한 유형의 실행 파일이 있는 경우 :
find . \
-type f `# Files only` \
-exec bash -c \
$'file -b -- \'{}\' | grep -qP -- \'executable$\'' \; `# Executable` \
-print; # Print the path if "exec" exits with status 0
권한에 관계없이 Shebang만 소유한 경우(예 +x
: ):
find . \
-type f `# Files only` \
-exec bash -c \
$'head -n 1 -- \'{}\' | grep -qP -- \'^#!.+\'' \; `# With shebang` \
-print; # Print the path if "exec" exits with status 0
현재 사용자에 대한 실행 권한만 있는 경우:
find . \
-type f `# Files only` \
-exec $'test -x \'{}\'' `# With current User executable permission` \
-print; # Print the path if "exec" exits with status 0