Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用iname在Linux Find命令中与RegExp匹配_Regex_Linux_Replace_Centos_Find - Fatal编程技术网

使用iname在Linux Find命令中与RegExp匹配

使用iname在Linux Find命令中与RegExp匹配,regex,linux,replace,centos,find,Regex,Linux,Replace,Centos,Find,我需要做一个大规模的文件重命名,分散在不同的文件夹和子文件夹。但我只需要更改那些在特定序列组中具有特定值的文件。第一个序列始终有一个数值,但其他序列可能为空(参见示例中的第4行) 示例:仅更改第二个序列组中与“123”和“888”匹配的文件中的序列值 从这组文件中,它应该只接受前四个文件名 023-123-491-716-11-20170921.txt 215-123-789-014-11-20170312.txt 053-123-123-066-09-20180101.txt 088-123-

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

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

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

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    
对于此任务,我将使用此命令

$ find . -iname 'regexp' -exec rename -v '-123-' '-888-' {} \;
这是在中测试的任务“\d+-123-\d*-\d*-\d*-\d*-\d*.txt”的简单有效RegExp,但在查找中不起作用

为了测试regex,我只需要find部分,但是regexp与期望的结果不匹配。我试过这种表达方式,但效果不好

所有这些都没有结果:

$ 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)
这一个显示了错误的结果,因为它没有考虑匹配值必须正好在第二个序列组中,并且忽略了第四行示例:

$ find . -iname "[0-9]*-123-*.txt"
023-123-491-716-11-20170921.txt
215-123-789-014-11-20170312.txt
053-123-123-066-09-20180101.txt
321-673-123-916-20-20170921.txt
476-976-021-123-20-20170921.txt
123-987-123-001-09-20180101.txt
我一直在检查Emacs语法,但都不起作用,或者我做了一些非常错误的事情。感谢您的帮助

感谢您不要使用regex进行搜索,它使用glob语法。 如果要使用正则表达式,请使用

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

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

这应该起作用:

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

我不确定find如何处理这个问题,但感谢您提供详细的答案。当时的问题是因为glob语法。这解决了我的问题。