使用iname与Linux Find Command中的RegExp匹配

时间:2018-08-02 16:25:04

标签: regex linux replace centos find

我需要进行大量文件重命名,这些文件分散在不同的文件夹和子文件夹中。但是我只需要更改在特定序列组中具有特定值的那些文件。第一个序列将始终具有数字值,但其他序列可能为空(例如,请参见第4行)

示例:仅在第二个序列组中更改与“ 123”和“ 888”匹配的文件中的序列值。

从这组文件中,它只能接受前四个文件名

"testVar"

对于此任务,我将使用此命令

023-123-491-716-11-20170921.txt
215-123-789-014-11-20170312.txt
053-123-123-066-09-20180101.txt
088-123--066-01-20180101.txt
123-345-678-910-08-20160321.txt
966-067-076-322-08-20170312.txt
321-673-123-916-20-20170921.txt
476-976-021-123-20-20170921.txt
987-211-322-677-09-20180101.txt
123-987-123-001-09-20180101.txt
986--123-061-14-20170101.txt
186-563-123--14-20170101.txt    

这是在https://regex101.com/中测试的任务“ \ d + -123- \ d *-\ d *-\ d *-\ d * .txt”的简单有效的RegExp,但在find中不起作用。

出于测试正则表达式的目的,我只需要查找部分,但正则表达式与所需结果不匹配。我尝试过这种表达式,但效果不佳

所有这些都没有结果:

$ find . -iname 'regexp' -exec rename -v '-123-' '-888-' {} \;

这显示了错误的结果,因为它没有考虑到匹配值必须准确地位于第二个序列组中,并且也忽略了第四行示例:

$ find . -iname '\d+-123-\d*-\d*-\d*-\d*.txt'
$ find . -iname "[0-9]+-123-*.txt"
$ find . -iname "\([0-9]\)+-123-*.txt"
$ find . -iname "\([0-9]\)*-123-*.txt"
$ find . -iname "([0-9])+-123-*.txt"
$ find . -iname "([0-9])*-123-*.txt"

(0 results)

我一直在检查Emacs语法,但是两者都不起作用,或者我做错了什么。任何帮助表示赞赏。

谢谢

1 个答案:

答案 0 :(得分:1)

-iname不会使用正则表达式进行搜索,而是使用glob语法。 如果要使用正则表达式,请改用-iregex

但是,-iregex匹配完整路径名,而不仅仅是文件名,并且匹配.中的搜索,其中包括前导./

此外,find支持的regextypes都不支持\d字符类,因此您必须改为使用[0-9][[:digit:]]

这应该有效:

find . -regextype posix-extended -iregex '.*/[0-9]+-123(-[0-9]+){4}\.txt'