我正在编写一个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-egrep
Agrep, 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/