Unix系统上的“文件类型”是常规文件,目录,命名管道,字符特殊文件,符号链接等。这些是find
可以使用其-type
选项进行过滤的文件类型。
该find
实用程序本身无法区分“ shell脚本”,“ JPEG图像文件”或任何其他类型的常规文件。但是,file
实用程序可以区分这些类型的数据,该实用程序会查看文件本身中的特定签名以确定其类型。
标记不同类型的数据文件的常用方法是通过其MIME类型,并且file
能够确定文件的MIME类型。
使用file
with find
来检测常规文件的MIME类型,并仅使用它来查找shell脚本:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
或者,使用bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
如果只希望检测具有该名称的脚本,请-name sunrise
在之前添加-exec
。
find
上面的命令将在当前目录中或当前目录下找到所有常规文件,并为每个此类文件调用一个简短的内嵌shell脚本。该脚本file -bi
在找到的文件上运行,并且如果该命令的输出包含字符串,则退出状态为零/x-shellscript
。如果输出不包含该字符串,则会以非零退出状态退出,这将导致find
立即继续下一个文件。如果发现该文件是Shell脚本,则该find
命令将继续输出文件的路径名(-print
末尾的,也可以用其他操作代替)。
该file -bi
命令将输出文件的MIME类型。对于Linux(和大多数其他系统)上的Shell脚本,这类似于
text/x-shellscript; charset=us-ascii
而在file
实用程序版本稍旧的系统上,
application/x-shellscript
公用位是/x-shellscript
子字符串。
请注意,在macOS上,由于某些原因,您必须使用file -bI
而不是(该选项的功能有所不同)。macOS上的输出类似于Linux系统的输出。file -bi
-i
您是否想对每个找到的Shell脚本执行一些自定义操作,可以用另一个命令-exec
代替上面-print
的find
命令中的脚本,但是也可以这样做
find . -type f -exec sh -c '
for pathname do
case $( file -bi "$pathname" ) in
*/x-shellscript*) ;;
*) continue
esac
# some code here that acts on "$pathname"
done' sh {} +
或者bash
,
find . -type f -exec bash -c '
for pathname do
[[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue
# some code here that acts on "$pathname"
done' bash {} +
有关:
--filetype
对find命令或其他任何会告诉你的文件类型选项。唯一可以做的就是使用--exec file {} \;
它,然后grep Bourne
如果您正在寻找bash脚本,或者grep Perl
您正在寻找Perl脚本或类似的东西,则将其插入。