2012-11-23 44 views
9

我熟悉重命名,但我很好奇重命名仍然适用于删除重复的扩展?在bash中删除双重扩展

说我有一个名为几个文件:picture6.jpg.jpg

  • picture2.jpg.jpg
  • picture9.jpg.jpg
  • picture3.jpg.jpg
  • 你将如何删除重复的扩展?

    最终结果:

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

回答

13

假设:

  • 你ONL Ÿ要在当前工作目录正是由于.jpg.jpg执行这一(非递归)
  • 双扩展具有格式:

然后下面的脚本将工作:

#!/bin/bash 

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

说明:

  • 创建在该目录中
  • 一套名为clean_de.sh新的文件,它由chmod +x clean_de.sh
  • 为可执行文件,然后运行它:

要使用该脚本


警告的A注:

正如@gniourf_gniourf所指出的那样,使用-n选择,如果您的mv支持它。

否则 - 如果你在同一个目录有a.jpga.jpg.jpg,它会重命名a.jpg.jpga.jpg并在此过程覆盖现有a.jpg没有警告。

+0

这正是我需要的谢谢。我会假设是%\正在做这个改变? –

+0

如果你的'mv'有'-n'选项(没有clobber选项),你可以使用它,只是为了在目标文件已经存在的情况下安全。 –

4

一号线rename命令也应该足够了(你的情况下,至少):

rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg 
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 - 实际重命名文件

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