在文件名中包含数字的文件的目录中,如何查找大于或小于 x 的文件

在文件名中包含数字的文件的目录中,如何查找大于或小于 x 的文件

超出上下文(仅通过比较来说明“我想要做什么”):当查询数据库时,何时可以选择 id > 5 和 id < 99......

CONTEXT-part1 :位于包含大量文件的目录中。

CONTEXT-part2 :文件名类似于 123.txt 145.txt 233.txt 678.txt (不按顺序)

我想要做什么:查找(文件名中)大于 127 且小于 300 的文件

示例:在“part2”中找到 145.txt 233.txt

我开始尝试的:find . -regextype sed -regex '.*/[1-9].ref'

但如何更好地做到这一点?

答案1

使用zshshell,通配模式part2/<128-299>.txt将匹配目录中part2严格以 127 到 300 之间的数字开头、以字符串 结尾的所有名称.txt

例子:

$ tree
.
|-- part1
|   |-- 123.txt
|   |-- 145.txt
|   |-- 233.txt
|   `-- 678.txt
`-- part2
    |-- 123.txt
    |-- 145.txt
    |-- 233.txt
    `-- 678.txt

2 directories, 8 files
$ printf '%s\n' part2/<128-299>.txt
part2/145.txt
part2/233.txt

在像这样的 shell 中bash,以下一组模式将执行相同的操作

part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt

前提是nullglob设置了 shell 选项,或者您可能会得到未展开的模式:

$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/12[89].txt
part2/145.txt
part2/233.txt
$ shopt -s nullglob
$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/145.txt
part2/233.txt

nullglob在没有(例如)的 shell 中sh,您将必须使用循环来测试每个生成的字符串是否存在:

for name in part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
do
    [ -e "$name" ] && printf '%s\n' "$name"
done

对于find,您将使用与非 shell 中相同类型的模式zsh

find part2 -name '12[89].txt' -o -name '1[3-9][0-9].txt' -o -name '2[0-9][0-9].txt'

但你显然zsh也可以在这里使用,

find part2 -exec zsh -c '[[ $1:t == <128-299>.txt ]]' zsh {} \; -print

这会为每个找到的路径名调用一个内联zsh脚本,并使用类似于本答案开头的模式来比较其文件名。

find显然也会递归到下面的子目录part2

相关内容