2

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

什么有效:

cd /mydir

ls ? ?.*

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

我正在努力工作

ls ? ?.* /mydir

它给了我输出:

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

我也试过:

ls /mydir ? ?.*

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

4

4 回答 4

3

从你写的评论中:

我在大学担任 linux 管理员和我目前的 shell 脚本课程之一。我的老师只是在复习基本的东西。而且,我目前的评估是获取我们类服务器的 tmp 目录中的文件数,以 .log 结尾的文件数以及只有 1 个字符名称的文件数并将数据存储在一个文件中,然后向用户显示存储的数据。我知道这很愚蠢,但这是我的任务。

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

您选择的解决方案

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

在两种情况下被破坏:

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

正确的 bash 方式如下:

shopt -s nullglob
shopt -u failglob
files=( /mydir/? /mydir/?.* )
echo "There are ${#files[@]} files found."
于 2013-11-13T17:02:20.243 回答
0

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

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

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

于 2013-11-13T16:31:02.740 回答
0

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

find /mydir \! -name "." -a \( -name "?" -o -name "?.*" \)
于 2013-11-13T16:33:34.147 回答
0

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

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

于 2013-11-13T16:34:16.007 回答