我有以下问题:我有一个像这样的文件列表
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
感谢您的帮助
答案 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