我试图列出所有具有 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 才能使其工作。