我正在编写一个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。

最佳答案

正则表达式必须与find返回的整个路径匹配。例如,如果您正在find中搜索文件,那么您的regex必须匹配,例如。

somedir/prefix_cats_apples_2.txt

更复杂的是,您可以通过将somedir/选项更改为-regextype来使用多种类型的regex,例如find。(emacs (default), posix-awk, posix-basic, posix-egrep, posix-extended没有改变能力)
posix-basic可能是您的工具(如posix-egrepAgrep, sed, find, etc..regex)之间最可转换的,因为您在posix-egrep中搜索文件的模式是:
'somedir/prefix_(cats|dogs)_(apples|oranges|tomatos).*[23].*$'

使用以下示例文件与您的文件名(结束编号范围为somedir/以显示以0-3结尾的文件的排除)进行匹配:
$ls -1 somedir/
prefix_cats_apples_0.txt
prefix_cats_apples_1.txt
prefix_cats_apples_2.txt
prefix_cats_apples_3.txt
prefix_cats_oranges_0.txt
prefix_cats_oranges_1.txt
prefix_cats_oranges_2.txt
prefix_cats_oranges_3.txt
prefix_cats_tomatos_0.txt
prefix_cats_tomatos_1.txt
prefix_cats_tomatos_2.txt
prefix_cats_tomatos_3.txt
prefix_dogs_apples_0.txt
prefix_dogs_apples_1.txt
prefix_dogs_apples_2.txt
prefix_dogs_apples_3.txt
prefix_dogs_oranges_0.txt
prefix_dogs_oranges_1.txt
prefix_dogs_oranges_2.txt
prefix_dogs_oranges_3.txt
prefix_dogs_tomatos_0.txt
prefix_dogs_tomatos_1.txt
prefix_dogs_tomatos_2.txt
prefix_dogs_tomatos_3.txt

现在,只匹配满足您的条件并传递常规0, 1的文件将产生:
$ find somedir/ -regextype posix-egrep -regex 'somedir/prefix_(cats|dogs)_(apples|oranges|tomatos).*[23].*$' | sort
somedir/prefix_cats_apples_2.txt
somedir/prefix_cats_apples_3.txt
somedir/prefix_cats_oranges_2.txt
somedir/prefix_cats_oranges_3.txt
somedir/prefix_cats_tomatos_2.txt
somedir/prefix_cats_tomatos_3.txt
somedir/prefix_dogs_apples_2.txt
somedir/prefix_dogs_apples_3.txt
somedir/prefix_dogs_oranges_2.txt
somedir/prefix_dogs_oranges_3.txt
somedir/prefix_dogs_tomatos_2.txt
somedir/prefix_dogs_tomatos_3.txt

由于您没有提供时间/日期在文件名中所处位置的示例,因此按时间/日期进行排序就留给您了。如果你还有问题,请告诉我。

关于linux - Bash脚本,find命令,使用通配符或正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56598918/

10-13 05:19