查找以任意 3 个字符结尾的目录或文件

查找以任意 3 个字符结尾的目录或文件

我正在尝试使用以下命令查找以任意 3 个字符结尾的目录或文件

ls -l /etc | grep ???$

这不起作用,,

我应该输入什么来查找以 3 或 4 或 5 或 6 或 7 ... 字符结尾的文件目录?

答案1

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3}$'

/etc/这将找到其中的文件或目录名称确切地3 个字符长。

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,}$'

这将找到/etc/其中的文件或目录最低限度3 个字符长。

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$'

这将查找/etc长度为 3 到 7 个字符的文件或目录。

阻止-maxdepth 1find 搜索 /etc 的子目录。

如果您想将匹配限制为仅目录,请-type d-maxdepth 1.对于常规文件,请使用-type f.

如果您打算对找到的文件/目录执行任何操作,可以使用 find 的-exec选项。例如

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -exec du -sch {} +

xargs(但使用 NUL 分隔符以避免文件名中出现空格、换行符等问题)。这允许您在之前使用任何可以在管道中处理 NUL 分隔输入的工具xargs。例如:

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -print0 | 
  head -z -n 10 |
  xargs -0r ls -ld

答案2

要列出单个目录中至少包含三个字符的名称(即非递归),您可以使用任何通配模式*??????**???*。每个?匹配单个字符,而*匹配任意数量的字符。

/etc要在以下列出此类名称ls

ls -ld /etc/*???

或者简单地说,

printf '%s\n' /etc/*???

如果你想列出以三结尾的名字具体的字符(例如xyz),然后用作*xyz模式。

要递归搜索此类名称,您可以(在 中bash)使用shopt -s globstar启用**通配模式(递归地向下匹配到子目录),然后...

ls -ld /etc/**/*???

默认情况下,该**模式在 shell 中处于启用状态zsh

具有这些名称的东西(不仅仅是调用ls),使用循环:

shopt -s globstar
for pathname in /etc/**/*???; do
    # use "$pathname" to do something
done

dashshell 或 plain中sh,此循环的等效项是

find /etc -name '*???' -exec sh -c '
    for pathname do
        # use "$pathname" to do something
    done' sh {} +

有关的:


您的使用grep表明您将正则表达式与文件名通配模式混淆了。在正则表达式中,点 ( .) 匹配任何一个单个字符,而?仅匹配该字符?(至少在基本正则表达式中,这是grep默认使用的)。

文件名模式也始终是锚定的,因此无需使用$正则表达式中的 as 显式锚定该模式(但该模式必须与完整文件名匹配,因此与xyz该名称完全匹配,同时与*xyz任何以 结尾的文件名匹配xyz)。

有关的:

答案3

您可以使用findand 过滤结果:

find -type f | egrep '3$|4$|5$'

相关内容