删除bash中的双扩展

删除bash中的双扩展,bash,shell,rename,Bash,Shell,Rename,我熟悉重命名,但我很好奇重命名是否仍然适用于删除重复的扩展 假设我有几个文件名为: 图2.jpg.jpg 图9.jpg.jpg 图3.jpg.jpg 图6.jpg.jpg 如何删除重复的扩展名 最终结果: 图2.jpg 图9.jpg 图片3.jpg 图片6.jpg 假设: 您只希望在当前工作目录中执行此操作(非递归) 双扩展名的格式与.jpg.jpg完全相同: 然后,以下脚本将起作用: #!/bin/bash for file in *.jpg.jpg do mv "${fi

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

假设我有几个文件名为:

  • 图2.jpg.jpg
  • 图9.jpg.jpg
  • 图3.jpg.jpg
  • 图6.jpg.jpg
如何删除重复的扩展名

最终结果:

  • 图2.jpg
  • 图9.jpg
  • 图片3.jpg
  • 图片6.jpg
假设:

  • 您只希望在当前工作目录中执行此操作(非递归)
  • 双扩展名的格式与
    .jpg.jpg
    完全相同:
然后,以下脚本将起作用:

#!/bin/bash

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

  • ${file%.jpg}
    :调用此部分
  • 来自同一来源:“${var%Pattern}从$var中删除与$var后端匹配的$Pattern的最短部分。”
  • 请注意,这里提到的“模式”称为globbing,即
要使用此脚本:

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

警告注释

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


否则-如果在同一目录中有
a.jpg
a.jpg.jpg
,它将
a.jpg.jpg
重命名为
a.jpg
,并在过程中在没有警告的情况下覆盖现有的
a.jpg

一行重命名命令也应该足够(至少适用于您的情况):


这里有一个更通用但仍然简单的解决方案:

for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done
简短说明:
find-名称“*.*.*
-这将递归地仅查找具有重复扩展名的文件

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

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


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

这正是我需要的,谢谢。我想是%\在做更改吗?如果您的
mv
-n
选项(无重击选项),您可以使用它,只是为了安全起见,以防目标文件已经存在。这将删除一个类似的命名非双后缀文件。如果目录包含image.jpg.php和image.jpg.jpg,则将删除第一个文件。
for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done