删除 bash 中的双重扩展

Posted

技术标签:

【中文标题】删除 bash 中的双重扩展【英文标题】:remove double extensions in bash 【发布时间】:2012-11-12 04:32:44 【问题描述】:

我对重命名很熟悉,但我很好奇重命名是否仍然适用于删除重复的扩展名?

假设我有几个文件名为:

picture2.jpg.jpg picture9.jpg.jpg picture3.jpg.jpg picture6.jpg.jpg

您将如何删除重复的扩展名??

最终结果:

图片2.jpg 图片9.jpg 图片3.jpg 图片6.jpg

【问题讨论】:

【参考方案1】:

假设:

您只想在当前工作目录中执行此操作(非递归) 双扩展名的格式与.jpg.jpg 完全相同:

那么下面的脚本就可以工作了:

#!/bin/bash

for file in *.jpg.jpg
do
    mv "$file" "$file%.jpg"
done

说明:

$file%.jpg:这部分叫Parameter Subsitution. 来自同一来源:"$var%Pattern 从 $var 中删除与 $var 后端匹配的 $Pattern 的最短部分。" 注意这里提到的“模式”叫做globbing,也就是different from regular expression in important ways。

要使用此脚本:

在该目录中创建一个名为 clean_de.sh 的新文件 将其设置为由chmod +x clean_de.sh 执行 然后通过./clean_de.sh 运行它

警告说明

正如@gniourf_gniourf 所指出的,如果您的mv 支持,请使用-n 选项。

否则 - 如果您在同一目录中有 a.jpga.jpg.jpg,它会将 a.jpg.jpg 重命名为 a.jpg 并在此过程中覆盖已经存在的 a.jpg 而不会发出警告。

【讨论】:

这正是我所需要的,谢谢。我会假设是 %\ 做的改变? 如果你的mv-n 选项(没有clobber 选项),你可以使用它,以防目标文件已经存在。【参考方案2】:

一行重命名命令也应该足够了(至少对于你的情况):

rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg

【讨论】:

【参考方案3】:

这里有一个更通用但仍然很容易解决这个问题的方法:

for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done

简短说明:find . -name "*.*.* - 这只会递归查找具有重复扩展名的文件

echo $oldName | rev | cut -f2- -d'.' | rev - 诀窍发生在这里:rev 命令对字符串执行反向操作,因此您现在可以看到,您想要从第一个点开始的整个文件名。 (gpj.gpj.fdsa)

mv $oldName $newName - 实际重命名文件

发行说明:因为它是一个简单的单行脚本,你可以找到未处理的案例。文件名中带有额外点的文件、超深目录结构等。

【讨论】:

这将破坏一个类似名称的非双后缀文件。如果目录包含image.jpg.php和image.jpg.jpg,则删除第一个文件。

以上是关于删除 bash 中的双重扩展的主要内容,如果未能解决你的问题,请参考以下文章

sh 使用BASH删除文件扩展名

sh 使用Bash删除文件扩展名

Bash:如何删除所有带有扩展名的文件上的所有空行[重复]

值是 Equatable 的字典序列的扩展

$var?中bash变量参数扩展中的问号是啥意思?

C中的bash条件扩展[重复]