Find

查找包含多個單詞的文件,其中單詞的順序無關緊要

  • May 11, 2022

我有一個包含很多子文件夾的巨大文件夾,我想在其中搜尋包含三個單詞的文件夾。請注意,文件夾名稱需要包含所有三個單詞,但單詞的順序無關緊要。

範例:我想查找包含單詞 和 的APE文件BananaTree

find folder -name '*APE*Banana*Tree*'

但是,此命令將考慮單詞的順序,而這並不重要,我想以任何順序找到包含這些單詞的任何文件夾。

只需使用 3-name秒:

find folder -name '*APE*' -name '*Banana*' -name '*Tree*' -type d

請注意,就像您在模式中使用萬用字元的任何時候一樣-name,它可能會失去名稱包含在使用者區域設置中不構成有效字元的字元序列的文件。

zsh

set -o extendedglob # best in ~/.zshrc
print -rC1 -- **/(*Banana*~^*APE*~^*Tree*)(ND/)

/ glob 限定符相當於find’s-type d來選擇directory類型的文件。

ksh93

FIGNORE='@(.|..)'
set -o globstar
set -- ~(N)**/@(*Banana*&*APE*&*Tree*)/
(($# == 0)) || printf '%s\n' "$@"

ksh93沒有 glob 限定符,但將 a 附加/到 glob 會將擴展限制為目錄文件或目錄的符號連結。

bash

shopt -s globstar dotglob nullglob extglob
set -- **/!(!(*Banana*)|!(*APE*)|!(*Tree*))/
(($# == 0)) || printf '%s\n' "$@"

ksh93與上面關於尾隨的註釋相同/

在哪裡:

  • D, FIGNORE,dotglob確保隱藏文件也被報告(就像這樣find做)
  • N, ~(N),nullglob使 glob 擴展為空,而不是在沒有匹配項時導致錯誤或擴展為自身
  • globstar使ksh93/bash理解 zsh 的**/遞歸萬用字元。
  • (x~^Y), @(X&Y),!(!(X)|!(Y))各自 shell 中匹配兩種模式的文件的三種方法

引用自:https://unix.stackexchange.com/questions/614599