如何仅使用 ls/grep 在 1 行中列出 8 个字符长且无扩展名的文件?

如何仅使用 ls/grep 在 1 行中列出 8 个字符长且无扩展名的文件?

我试图列出所有具有 8 个字符名称且不带扩展名的文件。

我的问题始于以下文件:“test.txt”,其中“.”在中间。

我已经尝试过,执行 ls 并将输出重定向到文件,然后使用 grep 获取我需要的文件,但我想知道:

是否可以使用 ls/grep/redirection/extglobs 等在 1 行中完成此操作?

答案1

您可以使用 grep 匹配任意 8 个字符,但以下字符除外.

 $ ls | grep '^[^.]\{8\}$'

或者如果管道有问题:

 $ find . -regex '.*/[^.][^.][^.][^.][^.][^.][^.][^.]'

或者在许多 shell 中简单地:

 $ ls -d [^.][^.][^.][^.][^.][^.][^.][^.]

答案2

您可以使用它?来匹配大多数 shell 中的任何一个字符:

$ GLOBIGNORE='*.*' eval "ls -d ????????"

在这种情况下,该GLOBIGNORE变量引导通配符避免.其中包含文件名,并且该-d标志在与目录名匹配时避免列出内容。使用man bash了解更多详细信息。

答案3

ls [a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9] 

所有长度为 8 个字符且仅包含字母数字的文件名(无连字符、句点等)

答案4

感谢所有提供意见的人,几个小时后我弄清楚了我想要做什么。

$ ls -d !(!(??????)|*(*.*))

必须设置 extglob 才能使其工作。

相关内容