您认为我已经可以在某个地方找到答案了,但是我很难做到。我想找到一些名称类似于
的日志文件myfile_3.log
但是我只想找到数字在一定范围内的数字。我尝试过这样的事情:
find <path> -name myfile_{0..67}.log #error: find: paths must precede expression
find <path> -name myfile_[0-67].log #only return 0-7, not 67
find <path> -name myfile_[0,67].log #only returns 0,6,7
find <path> -name myfile_*([0,67]).log # returns only 0,6,7,60,66,67,70,76,77
还有其他想法吗?
答案 0 :(得分:3)
如果要使用正则表达式匹配整数范围,请在-regex
命令中使用选项find
。
例如,要匹配0到67之间的所有文件,请使用以下命令:
find <path> -regextype egrep -regex '.*file([0-5][0-9]|6[0-7])\.txt'
正则表达式中包含2个部分:
[0-5][0-9]
匹配范围0-59 6[0-7]
匹配范围60-67 请注意,选项-regextype egrep
具有扩展的正则表达式。
还请注意,选项-regex
与整个文件名匹配,包括路径,这就是.*
在正则表达式开头的原因。
答案 1 :(得分:3)
使用 GNU Parallel ,您可以简单,简洁地执行此操作,但公认的是效率不高:
parallel find . -name "*file{}.txt" ::: {0..67}
以防万一,您想知道为什么我说它效率不高,这是因为它启动了find
的68个并行实例-每个实例在文件名中查找不同的数字...但这可能没问题。
答案 2 :(得分:1)
以下内容将找到所有名为myfile_X.log
的文件-X
部分是一个介于0到67之间的数字。
find <path> -type f | grep -E "/myfile_([0-9]|[0-5][0-9]|6[0-7])\.log$"
说明:
-type f
查找类型为 f ile的文件。
|
通过管道将文件路径传输到grep
进行过滤。
grep -E "/myfile_([0-9]|[0-5][0-9]|6[0-7])\.log$"
执行扩展的(-E
)正则表达式来查找路径的最后部分(即文件名),
myfile_
.log
结尾或者,如注释中的@ghoti所建议,您可以在-regex
命令中使用find
选项,而不用管道传输到grep
。例如:
find -E <path> -type f -regex ".*/myfile_([0-9]|[0-5][0-9]|6[0-7])\.log$"
注意:regexp与前面显示的上一个grep
示例非常相似。但是,它以.*/
开头,以匹配文件路径的所有部分,直到并包括最后的正斜杠。由于某些原因(我不知道),.*/
1 不需要grep
部分。
脚注:
1 如果任何读者都知道为什么将find的-regex
选项与ERE一起使用需要初始的.*
,而没有grep
的ERE则不需要-然后请发表评论。你会让我晚上睡得更好;)
答案 3 :(得分:0)
一种可能性是从可以由glob模式匹配的多个范围中建立范围。例如:
find . -name 'myfile_[0-9].log' -o -name 'myfile_[1-5][0-9].log' -o -name 'myfile_6[0-7].log'
答案 4 :(得分:-1)
尽管可以为特定范围制作正则表达式,但不能用正则表达式表示常规范围。最好使用find获取带有数字的文件,并使用另一个执行范围检查的工具(例如awk)对输出进行过滤。
START=0
END=67
while IFS= read -r -d '' file
do
N=$(echo "$file" | sed 's/file_\([0-9]\+\).log/\1/')
if [ "$N" -ge "$START" -a "$N" -le "$END" ]
then
echo "$file"
fi
done < <(find <path> -name "myfile_*.log" -print0)
在该脚本中,您对所有具有所需模式的文件执行find
,然后遍历找到的文件,sed
用于捕获文件名中的数字。最后,您将该数字与范围限制进行比较。如果比较成功,则将打印文件。
还有许多其他答案为示例中的特定范围提供了正则表达式,但它们并不通用。它们中的任何一个都可以轻松修改涉及的范围。