【问题标题】:remove double extensions in bash删除 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

【问题讨论】:

    标签: bash shell rename


    【解决方案1】:

    假设:

    • 您只想在当前工作目录中执行此操作(非递归)
    • 双扩展名的格式与.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 所指出的,如果您的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,则删除第一个文件。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 2015-03-14
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多