AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 483871
Accepted
Flux
Flux
Asked: 2018-11-25 06:43:45 +0800 CST2018-11-25 06:43:45 +0800 CST 2018-11-25 06:43:45 +0800 CST

如何按文件类型查找文件?

  • 772

我知道我可以使用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
files find
  • 5 5 个回答
  • 63412 Views

5 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-11-25T07:17:56+08:002018-11-25T07:17:56+08:00

    Unix 系统上的“文件类型”是诸如常规文件、目录、命名管道、字符特殊文件、符号链接等之类的东西。这些是find可以使用其-type选项过滤的文件类型。

    该find实用程序本身无法区分“shell 脚本”、“JPEG 图像文件”或任何其他类型的常规文件。然而,这些类型的数据可以通过实用程序来区分,该file实用程序查看文件本身内的特定签名以确定它们的类型。

    标记不同类型数据文件的常用方法是通过它们的MIME 类型,并且file能够确定文件的 MIME 类型。


    使用filewithfind来检测常规文件的 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 {} +
    

    有关的:

    • 了解 `find` 的 -exec 选项
    • 29
  2. Rolf
    2018-11-30T06:01:53+08:002018-11-30T06:01:53+08:00

    您可以file在每个找到的文件上执行,然后 grep 查找您感兴趣的结果。

    # When looking for ASCII Text
    find . -type f -exec file {} \; | grep "ASCII"
    # or for MS Word Documents
    find . -type f -exec file {} \; | grep "Microsoft Word"
    

    我建议使搜索模式尽可能接近您的期望,以保持低误报匹配的数量。

    请注意,文件名中带有换行符的文件可能会导致此方法出现问题。

    • 2
  3. zbyszek
    2022-02-12T07:01:42+08:002022-02-12T07:01:42+08:00

    一种不涉及太多 shell 魔法的较短形式:

    find . -exec sh -c "file '{}' | grep -q 'pattern'" \; -print

    • 2
  4. Stéphane Chazelas
    2018-11-25T14:08:12+08:002018-11-25T14:08:12+08:00

    使用perl'sFile::LibMagic模块:

    perl -MFile::LibMagic=:easy -MFile::Find -le '
      find sub {
        print $File::Find::name if
          $_ eq "sunrise" and
          -f and
          MagicFile$_ eq "PEM RSA private key"
      }, @ARGV' -- .
    

    File::LibMagic使用与 相同的算法和启发式算法库来猜测文件的类型file,但这里由于所有操作都在一次调用中完成,因此比必须为每个文件perl运行一次调用要高效得多。file

    • 0
  5. William Martens
    2021-03-13T08:22:23+08:002021-03-13T08:22:23+08:00

    我不确定这是否是人们想要的,但是:像这样?

    find DIRECTORY -name "*.EXT" -type f -exec COMMAND {} \;

    你更换的地方:

    DIRECTORY 包含要在其中搜索文件的目录(并且,选择操作)

    -name "*.EXT" 是扩展名,*wildcard 表示一切,所以一切以 "EXT" (, *每个以扩展名结尾的文件

    分机*)

    -type f 是,文件。(类型文件,而不是目录,例如)

    -exec COMMAND 在每个找到的文件上执行 COMMAND,扩展名为 EXT。

    例如,在 Docs/ 目录中计算所有扩展名为 .odt 的文件的 sha512 和:

    find Docs/ -name "*.odt" -type f -exec sha512sum {} \;
    
    • 0

相关问题

  • 检查某个文件夹是否存在于某个目录中

  • 从命令行查找和替换 CSS 文件中的颜色

  • 如何找到特定的文件类型并将它们 tar?

  • GNU find:在-exec中获取绝对和相对路径

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve