我正在尝试使用以下命令查找以任意 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 1
find 搜索 /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
在dash
shell 或 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
您可以使用find
and 过滤结果:
find -type f | egrep '3$|4$|5$'