【发布时间】:2012-07-26 12:28:05
【问题描述】:
我有一些文件的名称如下:'abcdefg_y_zz.jpg' 'abcdefg' 是数字序列,而 'y' 和 'zz' 是字母。 我需要获取所有数字序列以大于 10 的数字结尾的文件。'fg' 大于 10 的文件。
有没有人知道如何在 bash 脚本中做到这一点?
【问题讨论】:
-
是的,我知道该怎么做。
我有一些文件的名称如下:'abcdefg_y_zz.jpg' 'abcdefg' 是数字序列,而 'y' 和 'zz' 是字母。 我需要获取所有数字序列以大于 10 的数字结尾的文件。'fg' 大于 10 的文件。
有没有人知道如何在 bash 脚本中做到这一点?
【问题讨论】:
好的,从技术上讲,根据您的所有信息...
ls | grep '[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg'
【讨论】:
这个怎么样?只排除 f 位置为 0 的那些。
ls -1 | grep -v "?????0?_?_??.jpg"
更新 由于您想要 > 10 而不是 >= 10,因此您也需要排除 10。这样做:
ls -1 | grep -v "?????0*_?_??.jpg" | grep -v "??????10_?_??.jpg"
【讨论】:
更多脚本
#!/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
【讨论】:
如果文件名有序命名,则此awk 解决方案有效:
ls | awk 'BEGIN { FIELDWIDTHS = "5 2" } $2 > 10'
FIELDWIDTHS = "5 2" 表示$1 将引用前 5 个字符,$2 将引用接下来的 2 个字符。$2 > 10 匹配字段 2 大于 10 并隐式调用默认代码块,即 '{ print }'
【讨论】:
只有一个过程:
ls ?????+(1[1-9]|[2-9]?)_?_??.jpg
【讨论】:
到目前为止提供的所有解决方案都很好,但是任何有过 shell 编程经验的人都知道解析ls 绝不是一个好主意,必须避免。这实际上不适用于这种情况,我们可以假设文件的名称遵循某种模式,但这是一个应该记住的规则。更多解释here.
使用 GNU find 可以更安全地实现您想要的东西 - 假设您在文件所在的目录中运行命令,它看起来像这样:
find . -regextype posix-egrep -regex '\./[0-9]{5}[1-9][0-9]_[[:alpha:]]_[[:alpha:]]{2}.jpg$'
【讨论】: