【发布时间】:2019-06-14 13:11:06
【问题描述】:
我正在编写一个遍历特定目录中所有文件的 bash 脚本,并且:
- 选择名称与指定模式匹配的文件
- 按数据和时间排序(日期和时间是文件名的一部分)
- 获取 X 个最旧的文件
- 对它们执行某些操作
用于匹配文件的模式被传递给脚本,如下所示:
someprefix_[cats|dogs]_[oranges|apples|tomatos]_[2|3]*.txt
我尝试按如下方式实现(假设模式中的字段 6 和 7 包含日期和时间):
FILES=`find . -name "$PATTERN” | sort -t_ -k6 | head -n $NUM_OF_FILES`
它不起作用。
使用-name 和-regex 尝试了各种选项......
大多数在线示例都是针对不太复杂的模式。
由于可能需要处理数十万个文件,因此我正在寻找一种有效的解决方案。
出于可读性原因,我想避免使用 sed。
【问题讨论】:
-
echo someprefix_[cats|dogs]_[oranges|apples|tomatos]_[2|3]*.txt是否生成您要排序的文件列表? -
@TomFenech 它没有,但以下适用于 ls:ls someprefix_{cats,dogs}_{oranges,apples,tomatos}_[2-3]*.txt。但是它不适用于 find 并且 sort 在应用于 ls 的结果时会出错。
-
这可能会有所帮助:
"!=” -
您认为
[cats|dogs]在正则表达式中的含义是什么?在 globbing 模式中怎么样?我认为这两者都不是你想要的意思。因此,请弄清楚如何用任何一种语言编写您想要的内容,然后如何使用用该语言编写的表达式调用 find。
标签: linux bash command-line find