【问题标题】:Find and rename files/folders using regex使用正则表达式查找和重命名文件/文件夹
【发布时间】:2019-04-28 09:12:53
【问题描述】:

我正在尝试为以 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][-]/''/" {} \;

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

【问题讨论】:

    标签: regex linux bash unix rename


    【解决方案1】:

    使用-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]-/}"' - {} \;
    

    【讨论】:

    • 感谢@anubhava 的建议。我已经尝试过你的命令,但它似乎没有重命名文件。
    • 它回显了我需要重命名的所有文件和文件夹@anubhava
    • 感谢@anubhuva 的帮助,但我收到 mv 错误:两个文件名相同。
    • 我能想到的唯一方法是使用 2 find 命令: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]-/}"' - {} \;
    • 谢谢,它完成了工作。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 2017-08-10
    • 1970-01-01
    • 2018-08-22
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多