【问题标题】:Recursively change file name in folder and subfolders without changing file path递归更改文件夹和子文件夹中的文件名而不更改文件路径
【发布时间】:2020-05-09 22:27:36
【问题描述】:

我的文件格式类似于639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav。这些文件位于类似于日期的文件夹和子文件夹格式中。 ./2019/05/31/639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav

目标是删除_ 之前和包括_ 之前的所有内容。我能用rename -v 's/$\.+_//' 做些什么

但是当我尝试将此与 find 结合使用时,它似乎正确地重命名了子文件夹中找到的所有文件,但将它们放置\移动到我正在解决的文件夹的根目录中,所以在这种情况下 ./2019

我正在运行的命令是find -type f -name "*_*" | rename -v 's/$\.+_//'

如何确保文件位置不变?

【问题讨论】:

    标签: linux bash perl ubuntu file-rename


    【解决方案1】:

    $\ 将是未定义的,并且不会在您的正则表达式中执行任何操作。

    .+_ 将匹配从字符串开头到最后一个_ 字符的所有内容,包括路径信息。您需要使用限制性更强的表达式,不会捕获整个路径。

    有几种方法可以做到:

    s![^/]+_!!        greedy match of consecutive non-/ chars
    
    s!(.+/)?.+_!$1!   capture path and include it in the replacement
    

    当您准备好打开蠕虫罐时,还有一个解决方案会使用否定的后视断言。

    【讨论】:

    • 我去了s!(.+/)?.+_!$1! 你会推荐一个有助于更好地理解表达的网站吗?我绝对需要继续阅读它。我发现的大部分内容都是非常基本的表达方式。
    • @Grinnz 这是完美的。
    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多