首页 > 解决方案 > 使用正则表达式查找和重命名文件/文件夹

问题描述

我正在尝试为以 I0[0-9][0-9]- 开头的文件名找到正确的正则表达式,例如:“I097-”。我不熟悉正则表达式,但使用在线,我想出了这个 [I][0][\d][\d][-],我确信这不是我拥有的字符串的最佳正则表达式模式,但是我使用在线正则表达式工具进行了测试,并且可以正常工作。现在我想使用 Linux 'find' 来查找与此正则表达式匹配的所有文件,并通过将匹配字符串替换为空来重命名结果文件。

From:
I071-PTEN-7
./I071-PTEN-7/I071-PTEN-7.txt

To:
PTEN-7
./PTEN-7/PTEN-7.txt

command used:
find . -name "I0*" -type f -o -name "I0*" -type d -exec rename -n "s/[I][0][\d][\d][-]/''/" {} \;

但它似乎没有做任何事情,不知道发生了什么。任何帮助找到问题或解决方案将不胜感激。谢谢。

标签: regexlinuxbashunixrename

解决方案


使用-execdir选项仅获取文件名条目,find也无需在正则表达式中的每个字符周围使用字符类。

find . -name 'I0*' -execdir rename -n 's/^I0\d\d-//' {} \;

如果rename不工作,那么你可以试试这个:

find . -type f -name 'I0*' -execdir bash -c 'mv "$1" "${1/I0[0-9][0-9]-/}"' - {} \; &&
find . -name 'I0*' -execdir bash -c 'mv "$1" "${1/I0[0-9][0-9]-/}"' - {} \;

推荐阅读