【问题标题】:Linux: How to get files with a name that ends with a number greater than 10Linux:如何获取名称以大于 10 的数字结尾的文件
【发布时间】:2012-07-26 12:28:05
【问题描述】:

我有一些文件的名称如下:'abcdefg_y_zz.jpg' 'abcdefg' 是数字序列,而 'y' 和 'zz' 是字母。 我需要获取所有数字序列以大于 10 的数字结尾的文件。'fg' 大于 10 的文件。

有没有人知道如何在 bash 脚本中做到这一点?

【问题讨论】:

  • 是的,我知道该怎么做。

标签: linux bash filenames sh


【解决方案1】:

好的,从技术上讲,根据您的所有信息...

ls | grep '[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg'

【讨论】:

  • 谢谢,它确实有效。我将其更改为 '[0-9]{5}[1-9][1-9]_*.jpg' 更准确,它的作用就像一个魅力。再次感谢!
  • 希望你的意思是 [1-9][0-9] - 否则你会漏掉 10 的倍数
【解决方案2】:

这个怎么样?只排除 f 位置为 0 的那些。

ls -1 | grep -v "?????0?_?_??.jpg"

更新 由于您想要 > 10 而不是 >= 10,因此您也需要排除 10。这样做:

ls -1 | grep -v "?????0*_?_??.jpg" | grep -v "??????10_?_??.jpg"

【讨论】:

  • 这一行似乎给了我那些
【解决方案3】:

更多脚本

#!/bin/bash
for i in seq FIRST INCREMENT LAST
do
cp abcde$i_y_zz.jpg /your_new_dir //or whatever you want to do with those files
done

所以在你的示例行中 seq 将是

for i in seq 11 1 100000000

【讨论】:

    【解决方案4】:

    如果文件名有序命名,则此awk 解决方案有效:

    ls | awk 'BEGIN { FIELDWIDTHS = "5 2" } $2 > 10'
    

    说明

    • FIELDWIDTHS = "5 2" 表示$1 将引用前 5 个字符,$2 将引用接下来的 2 个字符。
    • $2 > 10 匹配字段 2 大于 10 并隐式调用默认代码块,即 '{ print }'

    【讨论】:

      【解决方案5】:

      只有一个过程:

      ls ?????+(1[1-9]|[2-9]?)_?_??.jpg
      

      【讨论】:

        【解决方案6】:

        到目前为止提供的所有解决方案都很好,但是任何有过 shell 编程经验的人都知道解析ls 绝不是一个好主意,必须避免。这实际上不适用于这种情况,我们可以假设文件的名称遵循某种模式,但这是一个应该记住的规则。更多解释here.

        使用 GNU find 可以更安全地实现您想要的东西 - 假设您在文件所在的目录中运行命令,它看起来像这样:

        find . -regextype posix-egrep -regex '\./[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg$'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-17
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 2022-11-20
          • 2021-10-17
          • 1970-01-01
          相关资源
          最近更新 更多