我正在尝试组合一个find
命令来列出/home
名称开头的目录,adm_
但我需要find
不区分大小写(rhel v7)。有没有办法做到这一点?
答案1
该-iname
选项就是您正在寻找的。
find /home -iname 'adm_*'
添加-type d
对目录的限制。
find /home -iname 'adm_*' -type d
答案2
您可以通过两种方式执行此操作,具体取决于您想要对与模式匹配的名称执行的操作。
如果您只想打印它们,请在 Linux 系统上使用-iname
而不是-name
with :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
,只需设置nocaseglob
shell 选项:
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
实现(包括find
RHEL 上的 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 1
FreeBSD 的-depth 1 -prune
,实际上更接近您需要的(这里.
您不想要的深度 0 ( ) 被排除,因为它与该模式不匹配))。