我正在尝试使用 ? 通配符只显示 1 个字符的文件,而 ?.* 则显示 1 个带扩展名的字符文件。
什么有效:
cd /mydir
ls ? ?.*
我正在尝试在 shell 脚本中使用它,因此我不能使用“cd”
我正在努力工作
ls ? ?.* /mydir
它给了我输出:
ls: cannot access ?.*: No such file or directory
我也试过:
ls /mydir ? ?.*
这给了我与以前完全相同的输出。
从你写的评论中:
我在大学担任 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."
cd
在 shell 脚本中完美运行,使用它。为了对脚本的影响最小,我会使用一个子shell:
( cd /mydir && ls ? ?.* )
这样,您就不会更改脚本的当前工作目录(也不会更改$OLDPWD
,这将被 破坏cd /mydir; ...; cd -;
)。
虽然ls
似乎是一个显而易见的选择,但find
可能更合适:
find /mydir \! -name "." -a \( -name "?" -o -name "?.*" \)
当您编写 时ls ? ?.* /mydir
,您会尝试显示匹配三种不同模式的文件:?
、?.*
和/mydir
. 您只想匹配/mydir/?
and /mydir/?.*
,因此这个命令:ls /mydir/? /mydir/?.*
.
编辑:虽然这是对初始问题(列表/mydir/?
和/mydir/?.*
)的正确答案,但 OP 想要这样做以解析输出并获取文件计数。请参阅@gniourf_gniourf 的答案,这是一种更好的方法。