不区分大小写查找目录

不区分大小写查找目录

我正在尝试组合一个find命令来列出/home名称开头的目录,adm_但我需要find不区分大小写(rhel v7)。有没有办法做到这一点?

答案1

-iname选项就是您正在寻找的。

find /home -iname 'adm_*'

添加-type d对目录的限制。

find /home -iname 'adm_*' -type d

答案2

您可以通过两种方式执行此操作,具体取决于您想要对与模式匹配的名称执行的操作。

如果您只想打印它们,请在 Linux 系统上使用-iname而不是-namewith :find

find /home -type d -iname 'adm_*'

要将它们用于以下用途find

find /home -type d -iname 'adm_*' -exec sh -c '
    for dirpath do
        # use "$dirpath" here
    done' sh {} +

这会将内联 shell 脚本应用于与模式大小写不敏感的任何位置或下的所有目录/home

如果您想将搜索限制为仅/home(而不是递归),也可以-maxdepth 1在搜索路径之后(在任何操作之前)插入。

您还可以选择直接在 shell 中使用它们。假设您正在使用bash,只需设置nocaseglobshell 选项:

shopt -s nocaseglob
printf '%s\n' /home/adm_*/

/home这将打印出不区分大小写匹配模式的所有目录路径名。尾随/确保我们只匹配目录。

要也在子目录内搜索,请另外设置选项globstar并使用**

shopt -s nocaseglob globstar
printf '%s\n' /home/**/adm_*/

显然,您可以直接在循环中使用它:

shopt -s nocaseglob globstar dotglob nullglob
for dirpath in /home/**/adm_*/; do
    # use "$dirpath" here
done

dotglob选项使通配模式与隐藏名称匹配(就像find所做的那样),并nullglob确保在不匹配时完全删除该模式。

答案3

对于find不支持非标准-iname扩展的实现,您可以使用:

find /home -name '[aA][dD][mM]_*' -type d

对于某些find实现(包括findRHEL 上的 GNU),不会包含名称中包含在当前语言环境中不形成有效字符的字节序列的文件。正在做:

LC_ALL=C find /home -name '[aA][dD][mM]_*' -type d

就像在 C 语言环境中一样,所有单字节值均形成一个有效字符。 (并且a, A, d, D, , m,都是可移植字符集的一部分,因此通常它们的编码在系统上的所有区域设置中都是不变的)M_

对于 GNU 的标准等效项,-maxdepth 1您可以这样做:

LC_ALL=C find /home/. ! -name . -prune -name '[aA][dD][mM]_*' -type d

(从技术上讲,这更像是-mindepth 1 -maxdepth 1FreeBSD 的-depth 1 -prune,实际上更接近您需要的(这里.您不想要的深度 0 ( ) 被排除,因为它与该模式不匹配))。

相关内容