欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

mdfind 查找 文件名 包含 AAA 或 BBB 或 CCC ,类型 为 PDF 或 pptx 或 key 或 png jpg 或 JPEG 的文件 chatgpt 有大用 有大大用 有大大大用

mdfind 查找 文件名 包含 AAA 或 BBB 或 CCC ,类型 为 PDF 或 pptx 或 key 或 png jpg 或 JPEG 的文件  

你可以用 mdfind 的 Spotlight 查询语法组合条件来实现。
要求是:

  • 文件名包含 AAA 或 BBB 或 CCC

  • 文件类型为 pdf、pptx、key、png、jpg、jpeg

命令如下:

mdfind '((kMDItemFSName == "*AAA*"c) || (kMDItemFSName == "*BBB*"c) || (kMDItemFSName == "*CCC*"c)) && ((kMDItemContentType == "com.adobe.pdf") || (kMDItemContentType == "org.openxmlformats.presentationml.presentation") || (kMDItemContentType == "com.apple.keynote.key") || (kMDItemContentType == "public.png") || (kMDItemContentType == "public.jpeg"))'    




说明:

  • kMDItemFSName → 文件名

  • *xxx* → 模糊匹配(含 xxx 的文件名)

  • c → 忽略大小写 (case-insensitive)

  • kMDItemContentType → 文件类型标识 (UTI)

    • com.adobe.pdf → PDF

    • org.openxmlformats.presentationml.presentation → PPTX

    • com.apple.keynote.key → Keynote

    • public.png → PNG

    • public.jpeg → JPG/JPEG


👉 如果你只想快速用扩展名来筛选,也可以这样简化(不依赖 UTI):

mdfind '((kMDItemFSName == "*AAA*"c) || (kMDItemFSName == "*BBB*"c) || (kMDItemFSName == "*CCC*"c)) && ((kMDItemFSName == "*.pdf"c) || (kMDItemFSName == "*.pptx"c) || (kMDItemFSName == "*.key"c) || (kMDItemFSName == "*.png"c) || (kMDItemFSName == "*.jpg"c) || (kMDItemFSName == "*.jpeg"c))'    




这个写法更直观,但依赖文件扩展名(有些文件可能扩展名不标准)。


要不要我帮你写一个 shell 脚本,输入关键字数组和扩展名数组,就能自动拼好 mdfind 命令?


UTI 是什么缩写

UTIUniform Type Identifier 的缩写,意思是 统一类型标识符。它是 Apple 在 macOS 和 iOS 系统中用来标识文件类型的标准方式。

解释:

  • UTI 是一种抽象的标识符,用于描述文件、数据、或其他资源的类型,不仅仅依赖于文件扩展名。

  • 它通常用于系统内部来判断文件的格式、类型和如何处理它。

例如:

  • com.adobe.pdf 是 PDF 文件的 UTI。

  • public.jpeg 是 JPEG 图片的 UTI。

  • org.openxmlformats.presentationml.presentation 是 PowerPoint 文件(PPTX)的 UTI。

举个例子:

  • 如果你打开一个 .pdf 文件,macOS 会通过其 UTI (com.adobe.pdf) 来确定这是一个 PDF 文件,并选择适当的程序(如 Preview)打开它。

为什么 UTI 重要?

  • 它提供了一种标准化的方法来处理不同的文件类型,而不依赖文件扩展名。

  • 比如同一个扩展名 .jpg,它的 UTI 可以是 public.jpegpublic.jpeg-10, 具体会根据文件的内容来决定。


mdfind '((kMDItemFSName == "*AAA*"cd) || (kMDItemFSName == "*BBB*"cd) || (kMDItemFSName == "*CCC*"cd)) && ((kMDItemFSName == "*.pdf"cd) || (kMDItemFSName == "*.pptx"cd) || (kMDItemFSName == "*.key"cd) || (kMDItemFSName == "*.png"cd) || (kMDItemFSName == "*.jpg"cd) || (kMDItemFSName == "*.jpeg"cd))'      mdfind '((kMDItemFSName == "*AAA*"c) || (kMDItemFSName == "*BBB*"c) || (kMDItemFSName == "*CCC*"c)) && ((kMDItemFSName == "*.pdf"c) || (kMDItemFSName == "*.pptx"c) || (kMDItemFSName == "*.key"c) || (kMDItemFSName == "*.png"c) || (kMDItemFSName == "*.jpg"c) || (kMDItemFSName == "*.jpeg"c))' 区别

两者的区别在于 cdc 选项的使用。具体来说:

  1. c:表示忽略大小写进行匹配。即,无论文件名的大小写如何,都会进行匹配。

  • 例如,kMDItemFSName == "*AAA*"c 会匹配所有包含 "AAA" 的文件名,不论 "AAA" 是大写、全小写,还是混合大小写(比如 "aaa"、"aAA" 或 "aaA" 都会匹配)。

  • cd:表示 忽略大小写包含文件名中的字符集匹配,也就是说除了忽略大小写外,还会匹配文件名中的字符集。

    • 这个匹配模式对某些字符集(例如 Unicode 字符、特殊符号等)做了更细致的处理。对于包含多种字符集的文件,cd 可能会做更精确的匹配。

    区别总结:

    • c 只是简单的大小写忽略。

    • cd 除了大小写忽略外,还处理字符集(即包含更广泛的匹配)。

    使用场景:

    • 如果你的文件名只有简单的大小写差异,使用 c 足够。

    • 如果文件名中有更复杂的字符集需求,可能 cd 会提供更精确的匹配。


    处理字符集 是什么 意思

    "处理字符集"(character set handling)指的是如何在计算机系统中处理和识别不同类型的字符,尤其是在包含各种语言符号、字母、数字以及其他特殊字符时。

    解释:

    • 字符集(Character Set) 是一组符号的集合,用于表示文本中的字符。每个字符集都包含特定语言或符号系统的字符,比如拉丁字母、汉字、阿拉伯字母、表情符号等。

    • 在操作系统、程序或数据库中处理文本时,字符集用于确保系统能正确地识别和显示不同的字符。

    字符集处理的挑战:

    • 不同语言:比如英语的字母、中文的汉字、日语的假名等,所有这些字符在计算机中都有不同的编码。

    • 字符编码:字符集本身定义了字符和数字之间的映射关系。常见的编码标准有 ASCIIUTF-8UTF-16 等。

    • 特殊字符:除了字母和数字,还有一些符号,比如标点符号、数学符号、货币符号、表情符号等,计算机需要确保能够正确处理这些字符。

    例子:

    1. 大小写敏感性

    • 英文中,字母 Aa 是不同的字符。如果文件名包含 "LA7" 和 "la7",系统默认会将它们视为不同的字符串。如果系统 不处理字符集,那么 "LA7" 和 "la7" 将被认为是两个不同的文件。

  • 国际化字符

    • 在一些情况下,文件名中可能包含非英文字符,如中文、阿拉伯文或日语假名等。比如 "文件名.pdf",如果系统只做简单的大小写匹配(如 c),可能无法正确处理中文字符。

    • 如果系统能 处理字符集,它就能够正确匹配所有语言中的字符,无论字符是大写、空格、标点符号,还是其他非英文字母。

    mdfind 中:

    • 使用 cd 可以更全面地处理文件名中的字符集,使得查询更加宽泛,尤其是在处理复杂或多语言的文件名时。例如,如果文件名中含有特殊符号或非拉丁字母字符,cd 会帮助确保正确匹配。

    • 使用 c 只是进行基本的大小写忽略,但不考虑字符集的其他方面。

    总结:

    “处理字符集”就是指在比较和搜索文本时,不仅考虑字符的大小写,还要处理其他语言和符号,确保在不同语言环境或不同编码下能正确匹配文件名中的所有字符。



    普通分类: