【问题标题】:Bash ls (glob-style)Bash ls(全局样式)
【发布时间】:2012-12-13 16:20:35
【问题描述】:

我有一个练习,我必须打印当前文件夹中包含的所有文件名,其中包含字母 [a-k][m-p][1-9] 至少 1 次(每个)。 我可能不得不使用ls (glob-style)

【问题讨论】:

  • 我会使用 grep 和正则表达式:ls -1 | grep -E "your_regex"
  • 好吧,我不知道正则表达式是什么,我认为我实际上必须使用 ls.. thx
  • 嗯?我必须使用 ls [glob-style]
  • 这可能对你有帮助stackoverflow.com/q/14004201/722238

标签: linux bash unix ls


【解决方案1】:

要完整,您需要搜索所有组合:

ls *[a-k]*[m-p]*[1-9]* *[a-k]*[1-9]*[m-p]* \
   *[m-p]*[a-k]*[1-9]* *[m-p]*[1-9]*[a-k]* \
   *[1-9]*[m-p]*[a-k]* *[1-9]*[a-k]*[m-p]*

【讨论】:

    【解决方案2】:

    100% 纯 bash(而且很有趣!)的可能性:

    #!/bin/bash
    
    shopt -s nullglob
    a=( *[a-k]* )
    b=(); for i in "${a[@]}"; do [[ "$i" = *[p-z]* ]] && b+=( "$i" ); done
    c=(); for i in "${b[@]}"; do [[ "$i" = *[1-9]* ]] && c+=( "$i" ); done
    printf "%s\n" "${c[@]}"
    

    没有任何外部进程!没有管道!只有纯粹的 bash!对于名称中带有有趣符号的文件(例如,换行符)100% 安全(而使用 ls 的其他方法并非如此)。如果您想真正看到文件名中的有趣符号并正确引用它们,以便重用输出,请使用

    printf "%q\n" "${c[@]}"
    

    代替最后的printf 语句。

    注意。 模式 [a-k][p-z] 取决于区域设置。您可能需要设置LC_ALL=C 以确保[a-k] 真正意味着[abcdefghijk] 而不是其他东西,例如[aAbBcCdDeEfFgGhHiIjJk]

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果顺序很重要,那么您可以使用通配符:

      $ ls *[a-k]*[m-p]*[1-9]*
      ajunk404  am1  cn5
      

      否则,只需 grep 分别为每个组:

      ls | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
      1ma
      ajunk404
      am1
      cn5
      m1a
      

      注意:ls 将显示目录,如果你真的只希望文件在里面使用find

      find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
      

      【讨论】:

        【解决方案4】:

        如果顺序不重要,并且字母出现一次或多次,则可以使用链式 grep。

        ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"
        

        如果顺序很重要,那么只需使用 glob 模式

        ls *[a-k]*[m-p]*[1-9]*
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-15
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多