使用 find & sed 查找具有给定 shebang 行的所有脚本

使用 find & sed 查找具有给定 shebang 行的所有脚本

我想找出具有特定 shebang 行的所有脚本。具体来说,我想要符合以下条件的所有文件:

  • 它主要是一个纯文本文件(创建的东西gzexe看起来不太友好)
  • 第一行仅包含#!/bin/sh#! /bin/sh(带有空格)

我想用find,sedgrepfile可用)来完成此操作。
文件名是没有用的,因为有些脚本没有扩展名,甚至扩展名错误。另外,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。
  • 取自 Costas,它用于[[:blank:]]*处理空格和制表符。
  • 避免使用echofrom 神经元,而是使用 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

相关内容