用?与ls的通配符

时间:2013-11-13 16:20:05

标签: bash scripting wildcard ls

我正在尝试使用?通配符只显示1个字符文件,?。*显示1个带扩展名的字符文件。

什么有效:

cd /mydir

ls ? ?.*

我正在尝试在shell脚本中使用它,因此我无法使用“cd”

我想要开始工作

ls ? ?.* /mydir

它给了我输出:

ls: cannot access ?.*: No such file or directory

我也试过了:

ls /mydir ? ?.*

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

4 个答案:

答案 0 :(得分:3)

你写的评论:

  

我在大学期间为linux管理员和我当前的shell脚本中的一个。我的老师只是在讨论基本的东西。而且,我目前的共同点是获取我们类服务器的tmp目录中的文件数,以.log结尾的文件数和只有1个字符名的文件数,并将数据存储在文件中然后将存储的数据显示给用户。我知道这很愚蠢,但这是我的任务。

我只希望他们不会教你在大学里解析ls的输出......这是最可怕的事情之一。请参考以下链接:

您选择的解决方案

ls /mydir/? /mydir/?.* | wc -l

在两种情况下被打破:

  • 如果没有匹配的文件,您将收到错误消息。您可以通过两种方式解决此问题:使用shopt -s nullglob或仅将stderr重定向到devnull
  • 如果文件名中有换行符。试一试:touch $'a.lol\nlol\n\lol\nlol\nlol'。 LOL。

正确的bash方式如下:

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

答案 1 :(得分:0)

cd在shell脚本中完美运行,使用它。为了对脚本产生最小的影响,我将使用子shell:

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

这样,你就不会改变脚本的当前工作目录(而$OLDPWD也不会改变,cd /mydir; ...; cd -;会被破坏。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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