如何列出当前目录下第二个字符为数字的所有文件?

如何列出当前目录下第二个字符为数字的所有文件?

我尝试过ls ?[0-9]*,这会匹配当前目录中的所有文件,但也会将当前目录中的任何目录扩展为并匹配任何子目录中的文件。我希望 * 仅匹配当前目录。

---- Program output --------------------------------
f1
f2
g2t
g3t

d2:

d4:

--- Expected output (text)---
d2
d4
f1
f2
g2t
g3t

这里d2和d4是目录,其他是文件。我希望它们被列为 d2 和 d4,而不是 d2: 和 d4:

答案1

?[0-9]* 仅有的扩展到名称当前的第二个字符为数字的目录。 ls,当获取目录名称时,显然会显示该目录的内容,这意味着您必须告诉ls不要这样做。

您可以使用以下方法执行此操作ls -d

ls -d -- ?[0-9]*

或者

ls -d ./?[0-9]*

--如果文件名以破折号开头,则 and将./停止ls将文件名的第一个字符解释为选项。

如果您只对非目录感兴趣(并且还想清除目录的符号链接),那么有两种显而易见的方法可以做到这一点。

  1. 使用 shell 循环,测试每个名称以查看它是否是目录,如果不是则显示名称:

    for name in ?[0-9]*; do
        [ ! -d "$name" ] && printf '%s\n' "$name"
    done
    

    要包含以点开头的文件(隐藏文件),shell 可能有一个dotglobshell 选项,您可以在循环之前设置该选项(shopt -s dotglobin bash)。

  2. 用于find在当前目录中查找非目录(并清除目录的符号链接):

    find -L . -maxdepth 1 ! -type d -name '?[0-9]*'
    

    -Lmake 选项引用find任何-type d符号链接的目标(如果当前路径名是符号链接)。

答案2

您可以使用正则表达式将 ls 通过管道传输到egrep,如下所示:

ls | egrep '.\d.*'

相关内容