我需要进行大量文件重命名,这些文件分散在不同的文件夹和子文件夹中。但是我只需要更改在特定序列组中具有特定值的那些文件。第一个序列将始终具有数字值,但其他序列可能为空(例如,请参见第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语法,但是两者都不起作用,或者我做错了什么。任何帮助表示赞赏。
谢谢
答案 0 :(得分:1)
-iname
不会使用正则表达式进行搜索,而是使用glob语法。
如果要使用正则表达式,请改用-iregex
。
但是,-iregex
匹配完整路径名,而不仅仅是文件名,并且匹配.
中的搜索,其中包括前导./
。
此外,find支持的regextypes都不支持\d
字符类,因此您必须改为使用[0-9]
或[[:digit:]]
。
这应该有效:
find . -regextype posix-extended -iregex '.*/[0-9]+-123(-[0-9]+){4}\.txt'