【问题标题】:How to list and sort pictures with just one number in its name?如何列出和排序名称中只有一个数字的图片?
【发布时间】:2020-11-11 20:36:10
【问题描述】:

如何在mac 上的bash 中列出所有jpg,并以数字作为名称?我有一个文件夹,里面有几张图片,名字中都有数字。

但是,我只想在 bash 中列出并排序这些图片,名称中只有 1 个数字,布局如下:1.jpg30.jpg,但不是 1-1.jpg30-1-2.jpg 等.

我试过ls $* | sort -V,但它给了我所有的图片。

我怎样才能达到预期的效果?

【问题讨论】:

  • @Jetchisel :您忘记引用-iname 的参数。另外,即使这是一个微不足道的解决方案,我认为您应该将其写为答案。
  • @Jetchisel:那仍然匹配1-1.jpg
  • find . -type f ! -iname '*[0-9]-[0-9]*.jpg' | sort -V
  • @Inian,删除第一条评论。
  • 在 bash 中只需 shopt -s extglobecho *([^0-9])+([0-9])*([^0-9])

标签: bash macos sorting command-line-interface ls


【解决方案1】:

您不需要任何第三方工具,只需启用bash 扩展通配符(如果默认未启用)。 nullglob 选项允许不匹配文件的文件名模式扩展为空字符串,而不是它们本身

shopt -s extglob nullglob

如果您确定文件名中不能包含其他字母数字字符,那么要排除包含- 的文件名,您只需

printf '%s\n' !(*-*).jpg

或者只匹配带有数字的文件名

printf '%s\n' [[:digit:]]!(*-*).jpg

或者将其包装在一个子 shell 中,以避免在交互式 shell 中设置全局选项。

( shopt -s extglob nullglob ; printf '%s\n' [[:digit:]]!(*-*).jpg ; ) |
sort -V

至于为什么你的尝试不起作用,ls $* 永远不会起作用,因为$* 是一个特殊的bash shell 变量,它通过连接所有传递的命令行参数并由IFS 的值连接而创建.您是否尝试将 * 作为参数传递并在函数/脚本中处理 $* 并在返回的列表上排序?

【讨论】:

    【解决方案2】:

    使用 Bash 的内置扩展通配符模式。

    shopt -s extglob 
    ls +([[:digit:]]).{{[jJ][pP],[pP][nN]}[gG],{[gG],[tT]}[iI][fF]?([fF])} | sort -n
    

    或不区分大小写的通配符:

    shopt -s extglob nocaseglob
    ls +([[:digit:]]).{{jp,pn}g,{g,t}if?(f)} | sort -n
    

    或者如果你只寻找小写的.jpg:

    shopt -s extglob
    ls +([[:digit:]]).jpg | sort -n
    

    【讨论】:

    • @Inian 选项是nocaseglob 用于文件名匹配。 nocasematch 影响字符串比较测试。
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2018-08-19
    • 2015-12-29
    • 2023-04-03
    • 1970-01-01
    • 2021-08-18
    • 2014-03-05
    • 2011-05-02
    相关资源
    最近更新 更多