与えられたshebang行を持つすべてのスクリプトを見つけるには、find&sedを使用します。

与えられたshebang行を持つすべてのスクリプトを見つけるには、find&sedを使用します。

特定のshebang行を含むすべてのスクリプトを見つけたいです。具体的には、次の基準に一致するすべてのファイルが必要です。

  • ほとんどはプレーンテキストファイルです(gzexe非常に使い慣れていないファイルを生成します)。
  • 最初の行には#!/bin/shor #! /bin/sh(スペースを含む) のみが含まれます。

findsedおよびgrep(使用可能)を使用して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

関連情報