【问题标题】:Using ? wildcard with ls使用 ?带 ls 的通配符
【发布时间】:2013-11-26 08:39:25
【问题描述】:

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

什么有效:

cd /mydir

ls ? ?.*

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

我正在努力工作

ls ? ?.* /mydir

它给了我输出:

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

我也试过了:

ls /mydir ? ?.*

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

【问题讨论】:

  • ls /mydir/? /mydir/?.* 应该可以工作...否则,您为什么不能在脚本中使用cd
  • 顺便说一句,这里ls 没用,如果您的目标只是显示文件,echo /mydir/? /mydir?.* 也可以。
  • @ZeddAlmighty:如果目录中没有名称为 1 字符且扩展名的文件,您将获得 No such file or directoryls。最好避免 ls
  • @user2719058 请花点时间阅读this wonderful document 我认识的最有知识的人写的。
  • @user2719058 And also this one

标签: bash scripting wildcard ls


【解决方案1】:

来自您写的评论:

我在大学里担任 linux 管理员和我目前的 1 个 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."

【讨论】:

  • +1,这是最好的答案。有时详细的答案在 SO 上并不受欢迎
  • 这应该是公认的答案。当我回答时,详细说明 OP 想要这样做的原因的评论没有准确说明。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    cd 在 shell 脚本中完美运行,使用它。为了尽量减少对脚本的影响,我会使用 subshel​​l:

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

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

    【讨论】:

    • 经常有用。但是我要添加一个警告,然后您可能会尝试在子外壳中的某处设置变量,并且当它们在整个外壳中“消失”时会感到惊讶^^
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2019-06-17
      • 1970-01-01
      • 2012-04-21
      • 2012-06-24
      • 2012-10-14
      相关资源
      最近更新 更多