주어진 shebang 라인이 있는 모든 스크립트를 찾으려면 find & sed를 사용하십시오.

주어진 shebang 라인이 있는 모든 스크립트를 찾으려면 find & sed를 사용하십시오.

특정 shebang 줄이 포함된 모든 스크립트를 찾고 싶습니다. 특히 다음 기준과 일치하는 모든 파일을 원합니다.

  • 대부분 일반 텍스트 파일입니다( gzexe매우 친숙해 보이지 않는 파일 생성).
  • 첫 번째 줄에는 #!/bin/shor #! /bin/sh(공백 포함) 만 포함됩니다.

find, sedgrep( 사용 가능)을 사용하여 file이 작업을 수행하고 싶습니다 .
일부 스크립트에는 확장자가 없거나 잘못된 확장자가 있기 때문에 파일 이름은 쓸모가 없습니다. 또한 제가 원하는 내용이 아닌 something.shshebang 라인이 있을 수도 있습니다 .#!/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 -qRC만 가져오는 데 사용됩니다.
  • [[:blank:]]*Costas에서 가져온 것으로 공백과 탭을 처리하는 데 사용됩니다 .
  • from 뉴런을 사용하지 말고 대신 echofind -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

관련 정보