在 sed 的帮助下重命名具有 2 个扩展名的文件系列

Posted

技术标签:

【中文标题】在 sed 的帮助下重命名具有 2 个扩展名的文件系列【英文标题】:Rename series of files with 2 extentions by help of sed 【发布时间】:2021-12-02 19:11:20 【问题描述】:

我试图重命名一些在一个文件夹中具有 2 个扩展名的文件,该文件夹也有多个文件夹。 例如:

"./3/test/us.bak.alt" 
 "./3/test/ca.bak.alt" 
 "./3/test/me.bak.alt" 
 "./3/test/mi.bak.alt"
 "./3/new.BAK.alt" 
 "./3/alt.bak.alt"

这些应重命名为 *.BAK(因此应删除末尾的 .alt),但前提是 .BAK 文件尚不存在。 我尝试了这段代码:

 find  -name "*.alt" | sed 's/\(.*\)\.alt/mv "&" \1.BAK"/'

输出应该是这样的:

     "./3/test/us.BAK" 
     "./3/test/ca.BAK" 
     "./3/test/me.BAK" 
     "./3/test/mi.BAK"
     "./3/new.BAK"
     "./3/alt.BAK"

我在这里缺少什么?

【问题讨论】:

对不起,你是对的..谢谢你的提及,其实我只是想使用 SED 命令 【参考方案1】:

你遗漏了几件事:

    您应该将查找搜索限制为文件。 您的sed 脚本不会将.bak.alt 替换为.BAK,而是将.alt 替换为.BAKsed 脚本中缺少双引号。 您应该将sed 搜索限制在文件名的末尾。 您的输入列表中有一个new.BAK.alt 文件。 您的输入列表中有一个空字符串""。 您在所需的输出列表中有一个./3/test/us.bak.alt,这显然与您的规范相矛盾。

让我们忽略最后三个问题,它们可能是拼写错误。要修复其他 4 个尝试:

find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" "\1.BAK"/'

如果第五期是真实的,并且您还有*.BAK.alt 文件要重命名为*.BAK

find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
  sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" "\1.BAK"/'

如果您对打印的输出感到满意,可以选择其中一种,如果您使用 GNU sed,只需很小的更改即可执行它们:

find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" "\1.BAK"/;e'

或:

find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
  sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" "\1.BAK"/;e'

esed 命令执行模式空间的内容)。

【讨论】:

首先感谢您的宝贵时间以及您提到的所有问题。我在写重要的一点是我希望 .BAK.alt 也被重命名,而你刚刚提到了它。但列表中仍然缺少 new.BAK.alt 您是否尝试过第二个提案? 是的,我做到了,文件 new.BAK.alt 仍然像之前一样 它在这里按预期工作。一定有别的东西。你能先编辑你的问题并修正错别字吗?如果双引号不是文件名的一部分,请删除它们,它们没有用。然后,对于其中一个丢失的文件,请显示其确切名称和您想要的确切新名称。 那么,如果您只执行find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \),您不会在输出中看到./3/new.BAK.alt【参考方案2】:

如果您被允许在您的机器上安装工具,请考虑使用rename(也称为prenameperl-rename,具体取决于发行版)。当您需要对文件进行定期名称更改时,它很有用。例如,如果您有目录持有说:img001.jpegimg002.jpegimg003.jpeg 并希望将其更改为 .jpg 文件,那么这样做就足够了

rename 's/jpeg/jpg' *.jpeg

【讨论】:

以上是关于在 sed 的帮助下重命名具有 2 个扩展名的文件系列的主要内容,如果未能解决你的问题,请参考以下文章

在不破坏现有迁移的情况下重命名 Django 模型

Linux下重命名文件或文件夹(mv命令与rename命令)

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

如何在不破坏 Subversion 历史的情况下重命名 Java 包?

在不停机的情况下重命名现有列

使用ant,在不知道完整路径的情况下重命名目录?