Regex 根据名称选择文件

Regex 根据名称选择文件,regex,linux,grep,find,Regex,Linux,Grep,Find,我有一个文件夹,其中有数千个文件,名称如下: feed_1.txt、feed_2.txt、feed_3.txt 如何仅选择feed_40000.txt及更高版本的文件?对于正则表达式解决方案: /feed_([4-9][0-9]{4}|[1-9][0-9]{5,})\.txt/g 这将匹配符合以下两种格式之一的字符串: feed_ab.txt,其中a是4-9中的一个数字,b是四个数字(对于regex解决方案,40000的情况: /feed_([4-9][0-9]{4}|[1-9][0-9]{5

我有一个文件夹,其中有数千个文件,名称如下:
feed_1.txt、feed_2.txt、feed_3.txt

如何仅选择
feed_40000.txt
及更高版本的文件?

对于正则表达式解决方案:

/feed_([4-9][0-9]{4}|[1-9][0-9]{5,})\.txt/g
这将匹配符合以下两种格式之一的字符串:

feed_ab.txt
,其中
a
4-9
中的一个数字,b是四个数字(对于regex解决方案,40000的情况:

/feed_([4-9][0-9]{4}|[1-9][0-9]{5,})\.txt/g
这将匹配符合以下两种格式之一的字符串:


feed_ab.txt
,其中
a
4-9
中的一个数字,b是四个数字(对于40000的情况,您可以使用此基于
awk
的检查来获取值
=40000
的文件名:

printf "%s\n" feed_[0-9]* | awk -F '[_.]+' '$2 >= 40000'
要循环这些文件名,请使用:

while read -r file; do
   printf "processing %s\n" "$file"
done < <(printf "%s\n" feed_[0-9]* | awk -F '[_.]+' '$2 >= 40000')
读取-r文件时;执行以下操作
printf“正在处理%s\n”“$file”

完成<您可以使用此基于
awk
的检查来获取值
=40000的文件名:

printf "%s\n" feed_[0-9]* | awk -F '[_.]+' '$2 >= 40000'
要循环这些文件名,请使用:

while read -r file; do
   printf "processing %s\n" "$file"
done < <(printf "%s\n" feed_[0-9]* | awk -F '[_.]+' '$2 >= 40000')
读取-r文件时;执行以下操作
printf“正在处理%s\n”“$file”
完成<你能做什么

find . -type f -name "feed_*" | awk -F"_" '$2+0>=40000' # => list of file names...
你能行

find . -type f -name "feed_*" | awk -F"_" '$2+0>=40000' # => list of file names...

您可以使用find regex开关:

find . -type f -regextype posix-awk -regex ".*/feed_([4-9]|[123][0-9])[0-9]{4,}\.txt"

您可以使用find regex开关:

find . -type f -regextype posix-awk -regex ".*/feed_([4-9]|[123][0-9])[0-9]{4,}\.txt"

好的,这也是我的方法(作为对exec和awk的学习和实验)

find -type f  -exec awk --re-interval 'FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++{;print FILENAME} END{if(FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++){print FILENAME}}' {} \;
下面是关于同一个问题的要点

I-我使用的第一件事--re interval for supporting{4,}来查找4个连续出现的0-9位数字,但是在awk的新版本中,这可以删除

II-1我学到了更多的知识

a- When using \; at last of command it will read the empty size files BUT

b- When using \+ it will NOT display the 0 size files BECAUSE

c- We all know \+ collects all the files first then it will perform mentioned action in single shot, so obviously END section will pick only the last file and other files which have ZERO size will NEVER be read.
编辑:现在也添加一个非一行命令形式

find -type f  -exec awk --re-interval \
 'FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++{;print FILENAME} \
 END{if(FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++){print FILENAME}}' {} \;

好的,这也是我的方法(作为对exec和awk的学习和实验)

find -type f  -exec awk --re-interval 'FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++{;print FILENAME} END{if(FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++){print FILENAME}}' {} \;
下面是关于同一个问题的要点

I-我使用的第一件事--re interval for supporting{4,}来查找4个连续出现的0-9位数字,但是在awk的新版本中,这可以删除

II-1我学到了更多的知识

a- When using \; at last of command it will read the empty size files BUT

b- When using \+ it will NOT display the 0 size files BECAUSE

c- We all know \+ collects all the files first then it will perform mentioned action in single shot, so obviously END section will pick only the last file and other files which have ZERO size will NEVER be read.
编辑:现在也添加一个非一行命令形式

find -type f  -exec awk --re-interval \
 'FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++{;print FILENAME} \
 END{if(FILENAME ~ /feed_[4-9][0-9]{4,}.txt/ && !a[FILENAME]++){print FILENAME}}' {} \;

您可能会考虑<代码> AWK<代码>,因为您应该针对特定的问题提出一个特定的问题。因为堆栈溢出隐藏了与您无关的原因:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与堆栈溢出无关,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决此问题所做的工作。”。“对不起,我不理解你的反对意见。请解释一下你可以考虑<代码> AWK <代码>,因为你应该针对一个特定的问题提出一个具体的问题。因为堆栈溢出隐藏了你的密切原因:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与堆栈溢出无关,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决此问题所做的工作。”。"jww很抱歉,我不理解您的反对意见。请您解释一下好吗?回答很好,先生,我不知道这个选项也存在于find中,非常感谢您的分享。
-regextype
是GNU find,只是作为一个注释。@dawg:默认情况下regextype是emacs,您可以像这样编写regex,而不使用她使用的这个开关e仅缩短模式:
*/feed\([4-9]\[123][0-9]\)[0-9][0-9][0-9][0-9]+\.txt
@dawg:但很明显,在更一般的情况下,通过管道/执行find命令或使用能够进行数字比较的语言/工具更容易。regex对于
40+
来说很简单,但是对于
43217
来说就更复杂了(但效率并不低)。真棒的回答,先生,我从来不知道这个选项也存在于find中,非常感谢您的分享。
-regextype
是GNU find,只是作为一个注释。@dawg:默认情况下regextype是emacs,您可以像这样编写regex,而不必使用这个开关,这里使用这个开关只是为了缩短模式:
*/feed\([4-9]\[123][0-9]\)[0-9][0-9][0-9][0-9]+\.txt
@dawg:但很明显,在更一般的情况下,通过管道/执行find命令或使用能够进行数字比较的语言/工具更容易。正则表达式对于
40+
来说很简单,但是对于
43217
来说就更复杂了(但效率并不低)。