删除bash中的双扩展名

时间:2012-11-23 20:29:25

标签: bash shell rename

我熟悉重命名,但我很好奇重命名仍然申请删除重复的扩展?

说我有一些名为的文件:

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

如何删除重复的扩展名?

最终结果:

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

3 个答案:

答案 0 :(得分:16)

假设:

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

然后以下脚本将起作用:

#!/bin/bash

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

<强>解释

要使用此脚本:

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

警告提示

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

以下是针对此问题的更一般但仍然简单的解决方案:

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 - 实际重命名文件

发行说明:由于它是一个简单的单行脚本,您可以找到未处理的案例。文件名中包含额外点的文件,超深目录结构等