超出上下文(仅通过比较来说明“我想要做什么”):当查询数据库时,何时可以选择 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
使用zsh
shell,通配模式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
。