查找名称低于1950的数字的文件名

时间:2014-11-19 09:30:00

标签: linux bash shell sh busybox

我有以下问题:我有一个像这样的文件列表

File256name.txt
File307list.cvs
File2014text.xls

我会使用命令“find”来查找名称低于1950的数字的文件,因为上一个列表我只会列出这些文件

File256name.txt
File307list.cvs

我试过这个命令

find . -type f  \( -iname '*[1-9][0-9][0-9]*' \)

但它也会显示名称为> 1950

的包含数字的文件

作为额外的指示,所有文件都可以有不同的文件名和扩展名,并且数字的位置是不可预测的...我正在寻找一个简单的命令来使用find(对我来说必须使用find)通过包含一个公式仅选择包含低于1950的数字的文件

还要考虑我的linux版本的限制,即BusyBox v1.16.1

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

管道进入(G)awk

find . -type f | awk 'match($0,/[0-9]+/,a)&&a[0]<1950'

这仅匹配带有数字的文件,然后检查数字是否低于1950并打印。 它适用于只有1位数或4位且前导零的文件。

答案 1 :(得分:2)

你需要使用一个能够区分世纪十年的正则表达式:

.*(19[5-9][0-9]|[2-9][0-9]{3}).*

(这将找到大于或等于1950的4位数字。)

使用此正则表达式,您可以使用find的否定选项来获取没有数字&gt; = 1950的文件。要删除没有任何数字的文件,请使用第二个条件。

我没有使用find对此进行测试,但您使用的正则表达式允许1000&lt; 1950。

编辑:

完整的命令:

find . -regextype posix-egrep -regex '.*[0-9].*' \! -regex '.*(19[5-9][0-9]|[2-9][0-9]{3}).*'

随着busybox的发现,有必要进一步逃避:

find . -regex '.*[0-9].*' \! -regex '.*\(19[5-9][0-9]\|[2-9][0-9]\{3\}\).*'

答案 2 :(得分:0)

可以使用字符类子字符串删除在bash中完成:

#!/bin/bash

for i in "$@"; do
    ffn="${i##*/}"
    num="${ffn//[^0-9]/}"
    [ "$num" -le 1950 ] && echo "$i => $num"
done

<强>输入

File1949text.doc
File1950text.doc
File1951text.dat
File2014text.xls
File256name.txt
File307list.cvs

<强>输出:

$ bash ../fn1950.sh File*
File1949text.doc => 1949
File1950text.doc => 1950
File256name.txt => 256
File307list.cvs => 307