【问题标题】:Find filenames with number in name lower than 1950查找名称中编号小于 1950 的文件名
【发布时间】:2014-11-19 09:30:00
【问题描述】:

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

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

感谢您的帮助

【问题讨论】:

  • 是的,awk 可用

标签: linux bash shell sh busybox


【解决方案1】:

管道进入 (G)awk

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

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

【讨论】:

  • 我试过你的命令,但我仍然得到两个文件 MyNas> find /volume1/homes/admin/tmp/ -type f | awk 'match($0,/[0-9]+/,a)&&a[0]
  • 这些是结果还是您将这些文件传递给了 awk ?
  • 检查 Awk 的版本,匹配只在 GAWK 中可用,我可能应该提到这一点,对不起:(
  • 不,我的意思是完全按照您发布的方式运行您的命令,结果是两个文件的列表
  • 这些是可用的选项:-v VAR-VAL-F SEP-f FILE
【解决方案2】:

您需要使用正则表达式来区分十年与世纪:

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

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

使用此正则表达式,您可以使用find 的否定选项来获取没有编号 >= 1950 的文件。要消除没有任何编号的文件,请使用第二个条件。

我没有用 find 测试过,但是你使用的正则表达式允许 1000

编辑:

完整的命令:

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

对于busybox的find,需要更多的转义:

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

【讨论】:

  • OP 的示例包含只有 3 个数字的文件
  • @Jidder:这也行。正则表达式匹配数字 >= 1950(至少为 4 位),然后否定结果。这样,正则表达式不匹配 3 位数字,并且由于否定,查找条件将匹配(适用于所有小于 1000 的数字)。
  • 发现:无法识别:-regextype 我不能使用它
  • 现在用busybox 1.21.1测试
  • ...如果我只想指定一些扩展?
【解决方案3】:

这可以简单地在 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

【讨论】:

  • OP 使用 BusyBox。不是 bash。
  • 哦,抱歉我忽略了busybox的要求。我用find 查找了一些东西,但找不到与urzeit 采用的regex 方法不同/更有效的东西,但没有找到。很抱歉混淆了。
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多