Bash 使用?带ls的通配符

Bash 使用?带ls的通配符,bash,scripting,wildcard,ls,Bash,Scripting,Wildcard,Ls,我在试着用这个?通配符用于仅显示1个字符的文件,而?*用于显示扩展名为1个字符的文件 工作原理: cd/mydir ls* 我试图在shell脚本中使用这个,因此我不能使用“cd” 我想做的是什么 ls ? ?.* /mydir 它给了我输出: ls: cannot access ?.*: No such file or directory 我也试过: ls /mydir ? ?.* 这给了我与以前完全相同的输出。cd在shell脚本中非常有效,请使用它。为了尽量减少对脚本的影响,我将使用

我在试着用这个?通配符用于仅显示1个字符的文件,而?*用于显示扩展名为1个字符的文件

工作原理:

cd/mydir

ls*

我试图在shell脚本中使用这个,因此我不能使用“cd”

我想做的是什么

ls ? ?.* /mydir
它给了我输出:

ls: cannot access ?.*: No such file or directory
我也试过:

ls /mydir ? ?.*

这给了我与以前完全相同的输出。

cd
在shell脚本中非常有效,请使用它。为了尽量减少对脚本的影响,我将使用子shell:

( cd /mydir && ls ? ?.* )

这样,您就不会更改脚本的当前工作目录(也不会更改
$OLDPWD
,这将与
cd/mydir;…;cd-;
)发生冲突。

虽然
ls
似乎是一个明显的选择,
find
可能更合适:

find /mydir \! -name "." -a \( -name "?" -o -name "?.*" \)

当你写
ls???*/mydir
,您试图显示与三种不同模式匹配的文件:
?.
,和
/mydir
。您只想匹配
/mydir/?
/mydir/?。
,因此此命令:
ls/mydir//mydir/?。


编辑:虽然这是对初始问题的正确回答(列出了
/mydir/?
/mydir/?.*
),但OP希望这样做来解析输出并获取文件计数。请参阅@gniourf\u gniourf的答案,这是一种更好的方法。

您在评论中写道:

我是linux管理员学院的学生,目前正在上shell脚本课程。我的老师正在复习基础知识。我目前的任务是获取类服务器tmp目录中的文件数,以.log结尾的文件数,以及只有1个字符名称的文件数,并将数据存储在文件中,然后将存储的数据显示给用户。我知道这很愚蠢,但这是我的任务

我只希望他们不要在大学里教你解析
ls
的输出。。。这是最可怕的事情之一。请参阅以下连结:

您选择的解决方案

ls /mydir/? /mydir/?.* | wc -l
分为两种情况:

  • 如果没有匹配的文件,您将得到一个错误。您可以通过两种方式解决此问题:使用
    shopt-s nullglob
    或将
    stderr
    重定向到
    devnull
  • 如果文件名中有换行符。试试看:
    touch$'a.lol\nlol\n\lol\nlol\nlol'
    。哈哈
正确的bash方式如下所示:

shopt -s nullglob
shopt -u failglob
files=( /mydir/? /mydir/?.* )
echo "There are ${#files[@]} files found."

ls/mydir//mydir/?。
应该可以工作。。。否则,为什么不能在脚本中使用
cd
?顺便说一句,这里的
ls
是无用的,
echo/mydir//如果您的目标只是显示文件,mydir?*
也可以。@ZeddAlmighty:如果目录中没有名为1个字符且扩展名为1个字符的文件,您将使用
ls
获得
无此文件或目录。最好避免ls@user2719058请花些时间阅读我认识的最有知识的人写的文章。@user2719058通常很有用。但是我要添加一个警告,那就是您有可能尝试在子shell中的某个地方设置变量,当它们在englobing shell^^+1中进一步运行时“消失”时,您会感到惊讶,这是最好的答案。有时候,详细的答案会让人不喜欢,所以这应该是公认的答案。当我回答时,详细说明OP希望这样做的原因的评论并不精确。