我尝试过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
将文件名的第一个字符解释为选项。
如果您只对非目录感兴趣(并且还想清除目录的符号链接),那么有两种显而易见的方法可以做到这一点。
使用 shell 循环,测试每个名称以查看它是否是目录,如果不是则显示名称:
for name in ?[0-9]*; do [ ! -d "$name" ] && printf '%s\n' "$name" done
要包含以点开头的文件(隐藏文件),shell 可能有一个
dotglob
shell 选项,您可以在循环之前设置该选项(shopt -s dotglob
inbash
)。用于
find
在当前目录中查找非目录(并清除目录的符号链接):find -L . -maxdepth 1 ! -type d -name '?[0-9]*'
-L
make 选项引用find
任何-type d
符号链接的目标(如果当前路径名是符号链接)。
答案2
您可以使用正则表达式将 ls 通过管道传输到egrep,如下所示:
ls | egrep '.\d.*'