我想找出具有特定 shebang 行的所有脚本。具体来说,我想要符合以下条件的所有文件:
- 它主要是一个纯文本文件(创建的东西
gzexe
看起来不太友好) - 第一行仅包含
#!/bin/sh
或#! /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。 - 取自 Costas,它用于
[[:blank:]]*
处理空格和制表符。 - 避免使用
echo
from 神经元,而是使用 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