递归更改文件夹和子文件夹中的文件名而不更改文件路径

Recursively change file name in folder and subfolders without changing file path

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

目标是删除 _ 之前的所有内容,包括 _。我可以用 rename -v 's/$\.+_//'

但是当我尝试将它与 find 结合使用时,它似乎正确地重命名了在子文件夹中找到的所有文件,但是 places\moves 它们到文件夹的根目录,我正在处理这个案例./2019

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

如何确保文件位置不变?

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

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

有几种方法可以做到:

s![^/]+_!!        greedy match of consecutive non-/ chars

s!(.+/)?.+_!!   capture path and include it in the replacement

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