在 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
替换为.BAK
。
sed
脚本中缺少双引号。
您应该将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'
(e
sed 命令执行模式空间的内容)。
【讨论】:
首先感谢您的宝贵时间以及您提到的所有问题。我在写重要的一点是我希望 .BAK.alt 也被重命名,而你刚刚提到了它。但列表中仍然缺少 new.BAK.alt 您是否尝试过第二个提案? 是的,我做到了,文件 new.BAK.alt 仍然像之前一样 它在这里按预期工作。一定有别的东西。你能先编辑你的问题并修正错别字吗?如果双引号不是文件名的一部分,请删除它们,它们没有用。然后,对于其中一个丢失的文件,请显示其确切名称和您想要的确切新名称。 那么,如果您只执行find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \)
,您不会在输出中看到./3/new.BAK.alt
?【参考方案2】:
如果您被允许在您的机器上安装工具,请考虑使用rename
(也称为prename
和perl-rename
,具体取决于发行版)。当您需要对文件进行定期名称更改时,它很有用。例如,如果您有目录持有说:img001.jpeg
、img002.jpeg
、img003.jpeg
并希望将其更改为 .jpg
文件,那么这样做就足够了
rename 's/jpeg/jpg' *.jpeg
【讨论】:
以上是关于在 sed 的帮助下重命名具有 2 个扩展名的文件系列的主要内容,如果未能解决你的问题,请参考以下文章
Linux下重命名文件或文件夹(mv命令与rename命令)
如何查找多个文件、检查重复文件并用 bash、sed 脚本替换