我知道我可以使用find
:查找文件find . -type f -name 'sunrise'
。示例结果:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
我也知道我可以确定文件的文件类型:file sunrise
. 示例结果:
sunrise: PEM RSA private key
但是如何按文件类型查找文件?
例如my-find . -type f -name 'sunrise' -filetype=bash-script
:
./astronomy/sunrise
./schedule/sunrise
Unix 系统上的“文件类型”是诸如常规文件、目录、命名管道、字符特殊文件、符号链接等之类的东西。这些是
find
可以使用其-type
选项过滤的文件类型。该
find
实用程序本身无法区分“shell 脚本”、“JPEG 图像文件”或任何其他类型的常规文件。然而,这些类型的数据可以通过实用程序来区分,该file
实用程序查看文件本身内的特定签名以确定它们的类型。标记不同类型数据文件的常用方法是通过它们的MIME 类型,并且
file
能够确定文件的 MIME 类型。使用
file
withfind
来检测常规文件的 MIME 类型,并使用它来仅查找 shell 脚本:或者,使用
bash
,如果您只想检测具有该名称的脚本,请
-name sunrise
在之前添加。-exec
上面的
find
命令将在当前目录中或当前目录下查找所有常规文件,并为每个此类文件调用一个简短的内嵌 shell 脚本。如果该命令的输出包含字符串,则此脚本file -bi
在找到的文件上运行并以零退出状态退出/x-shellscript
。如果输出不包含该字符串,它将以非零退出状态退出,这会导致find
立即继续下一个文件。如果发现该文件是一个 shell 脚本,该find
命令将继续输出文件的路径名(-print
末尾的 ,也可以用其他操作替换)。该
file -bi
命令将输出文件的 MIME 类型。对于 Linux(和大多数其他系统)上的 shell 脚本,这将类似于而在具有稍旧版本的
file
实用程序的系统上,它可能是公共位是
/x-shellscript
子串。请注意,在 macOS 上,由于某些原因,您必须使用
file -bI
而不是(该选项的作用完全不同)。macOS 上的输出在其他方面类似于 Linux 系统的输出。file -bi
-i
你想对每个找到的 shell 脚本执行一些自定义操作吗,你可以用另一个
-exec
来代替上面命令-print
中的find
,但也可以这样做或者,与
bash
,有关的:
您可以
file
在每个找到的文件上执行,然后 grep 查找您感兴趣的结果。我建议使搜索模式尽可能接近您的期望,以保持低误报匹配的数量。
请注意,文件名中带有换行符的文件可能会导致此方法出现问题。
一种不涉及太多 shell 魔法的较短形式:
find . -exec sh -c "file '{}' | grep -q 'pattern'" \; -print
使用
perl
'sFile::LibMagic
模块:File::LibMagic
使用与 相同的算法和启发式算法库来猜测文件的类型file
,但这里由于所有操作都在一次调用中完成,因此比必须为每个文件perl
运行一次调用要高效得多。file
我不确定这是否是人们想要的,但是:像这样?
find DIRECTORY -name "*.EXT" -type f -exec COMMAND {} \;
你更换的地方:
例如,在 Docs/ 目录中计算所有扩展名为 .odt 的文件的 sha512 和: