特定の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