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

标签 linux bash perl ubuntu file-rename

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

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

但是,当我尝试将其与 find -type f -name "*_*" | rename -v 's/$\.+_//' 结合使用时,它似乎正确地重命名了在子文件夹中找到的所有文件,但将它们放置\移动到我正在使用的文件夹的根目录下,因此在这种情况下 ./2019

我正在运行的命令是 ojit_code

如何确保文件位置不会改变?

最佳答案

$\将是未定义的,并且不会在您的正则表达式中执行任何操作。
.+_将匹配从字符串开头到最后 _ 的所有内容字符,包括路径信息。您将需要使用更严格的表达式,不会捕获整个路径。

有几种方法可以做到:

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

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

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

关于linux - 递归更改文件夹和子文件夹中的文件名而不更改文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59882127/

相关文章:

c - 使用 C 创建子进程和父进程

linux - 如何检查文件是否仍在 bash 中复制?

regex - 为什么空格会导致sed中记住的模式输出不同的东西

bash - 如何限制 bash 在处理文件时删除空格

perl - 如何从返回Perl中数组的函数中获得第一项?

perl - 如何将 "lazy load"包用作委托(delegate)?

perl - 如何将 LWP 与客户端证书和 CA 一起使用

linux - 在VI编辑器中如何在打开的文件中定义变量以通过gf打开其他文件

linux - 无法在浏览器中打开我的 oracle 数据库

linux - 如何从崩溃的应用程序中释放大页面