查找包含多个匹配正则表达式/grep 的文件夹

小牛

我有一个包含数千个文件夹的文件夹结构。我希望能够找到所有文件夹,例如,包含多个 .txt 文件、多个 .jpeg 或其他任何文件夹,而不会看到任何仅包含此类单个文件的文件夹。

这些文件夹都应该只有一个特定类型的文件,但情况并非总是如此,并且尝试查找它们很乏味。

请注意,文件夹可能包含许多其他文件。

如果可能,我想将“FILE.JPG”和“file.jpg”匹配为匹配“file”或“jpg”的查询。

我一直在做的只是find . -iname "*file*"手动完成。

文件夹包含文件夹,有时有 3 或 4 层深

first/
  second/
     README.txt
     readme.TXT
     readme.txt
     foo.txt
   third/
     info.txt
   third/fourth/
     raksljdfa.txt

应该返回

first/second/README.txt
first/second/readme.TXT
first/second/readme.txt
first/secondfoo.txt```

搜索“txt”时

first/second/README.txt
first/second/readme.TXT
first/second/readme.txt

搜索“自述文件”时

pjh

这个纯 Bash 代码应该这样做(注意事项,见下文):

#! /bin/bash

fileglob=$1             # E.g. '*.txt' or '*readme*'

shopt -s nullglob       # Expand to nothing if nothing matches
shopt -s dotglob        # Match files whose names start with '.'
shopt -s globstar       # '**' matches multiple directory levels
shopt -s nocaseglob     # Ignore case when matching

IFS=                    # Disable word splitting

for dir in **/ ; do
    matching_files=( "$dir"$fileglob )
    (( ${#matching_files[*]} > 1 )) && printf '%s\n' "${matching_files[@]}"
done

运行程序时,将要匹配的模式作为参数提供给程序。例如

myprog '*.txt'
myprog '*readme*'

(模式上的引号是阻止它们匹配当前目录中的文件所必需的。)

关于代码的警告是:

  1. globstar是在 Bash 4.0 中引入的。该代码不适用于较旧的 Bash。
  2. 在 Bash 4.3 之前,globstar匹配遵循符号链接。这可能会导致重复输出,甚至由于循环链接而导致失败。
  3. **/模式扩展为层次结构中所有目录的列表。如果目录数量很大(例如,大于一万),这可能需要很长时间或使用过多的内存。

如果您的 Bash 版本早于 4.3,或者您有大量目录,则此代码是更好的选择:

#! /bin/bash

fileglob=$1             # E.g. '*.txt' or '*readme*'

shopt -s nullglob       # Expand to nothing if nothing matches
shopt -s dotglob        # Match files whose names start with '.'
shopt -s nocaseglob     # Ignore case when matching

IFS=                    # Disable word splitting

find . -type d -print0 \
    |   while read -r -d '' dir ; do
            matching_files=( "$dir"/$fileglob )
            (( ${#matching_files[*]} > 1 )) \
                && printf '%s\n' "${matching_files[@]}"
        done

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式匹配文件夹和所有子文件夹

正则表达式查找与文件扩展名匹配的文件,除非文件名包含字符串

Sublime Text 3-使用正则表达式在多个文件夹中搜索一个文件夹中的文件

使用正则表达式从带有R的文件夹中读取多个csv文件

Python Glob正则表达式文件搜索,其中包含多个匹配项的单个结果

正则表达式文件夹重定向包含相同的名称(创建循环)

正则表达式匹配URL的深度只有一个文件夹

如果文件夹名称与正则表达式匹配,则使用Cmd findstr

匹配正则表达式的文件名,但在带通配符的文件夹中

筛选目录中的所有文件,以查找与多个正则表达式匹配的单词

在路径中查找最后一个文件夹名称的正则表达式

正则表达式匹配某些子文件夹,并忽略其子文件夹

根据文件和文件夹名称的正则表达式匹配将文件复制到文件夹中

正则表达式以匹配文件夹结构中的有效路径

通过正则表达式搜索词grep多个文件夹的方法

使用正则表达式重命名多个文件夹

正则表达式以匹配带有或不带有“文件夹”的URL

如何将正则表达式应用于包含.txt文件的文件夹?

修改正则表达式以匹配扩展文件夹的说明

在多个文件中查找并替换正则表达式(匹配Unicode字符类Devanagari)

查找与正则表达式模式匹配的文件

使用正则表达式查找和grep仅获取文件夹

正则表达式匹配没有子文件夹的域

如何使用正则表达式查找文件夹的真实路径

文件夹路径的正则表达式

如何从路径列表中使用正则表达式查找文件或文件夹

使用 bash 脚本中文件中的正则表达式进行 Grep 而不包含更多文件夹

正则表达式 - 如何在动态文件夹名称中查找文件

正则表达式:从 Y 文件夹中查找 X 扩展名的文件