查找包含多个单词的文件,其中单词的顺序无关紧要

Jes*_*erg 3 find

我有一个包含很多子文件夹的大文件夹,我想在其中搜索包含三个单词的文件夹。请注意,文件夹名称需要包含所有三个单词,但单词的顺序无关紧要。

示例:我想查找包含单词APE,Banana和 的文件夹Tree

find folder -name '*APE*Banana*Tree*'
Run Code Online (Sandbox Code Playgroud)

但是,这个命令会考虑单词的顺序,虽然这并不重要,我想以任何顺序找到包含这些单词的任何文件夹。

Sté*_*las 7

只需使用 3-name秒:

find folder -name '*APE*' -name '*Banana*' -name '*Tree*'
Run Code Online (Sandbox Code Playgroud)

请注意,就像您在-name模式中使用通配符一样,它可能会错过名称包含在用户语言环境中未形成有效字符的字符序列的文件。

zsh

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

ksh93

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

bash

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

在哪里:

  • D, FIGNORE,dotglob确保也报告隐藏文件(就像这样find做)
  • N, ~(N),nullglob使 glob 扩展为空而不是导致错误或在没有匹配时扩展到自身
  • globstar制作ksh93/bash理解 zsh 的**/递归通配符。
  • (x~^Y), @(X&Y),!(!(X)|!(Y))各自 shell 中匹配匹配两种模式的文件的三种方法