“查找”文件中包含指定范围内的整数(以bash表示)

时间:2018-08-17 10:17:55

标签: linux bash find

您认为我已经可以在某个地方找到答案了,但是我很难做到。我想找到一些名称类似于

的日志文件
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

还有其他想法吗?

5 个答案:

答案 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_
    • 开始
    • 后跟一个0到67之间的数字。
    • .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用于捕获文件名中的数字。最后,您将该数字与范围限制进行比较。如果比较成功,则将打印文件。

还有许多其他答案为示例中的特定范围提供了正则表达式,但它们并不通用。它们中的任何一个都可以轻松修改涉及的范围。