我熟悉重命名,但我很好奇重命名仍然适用于删除重复的扩展?在bash中删除双重扩展
说我有一个名为几个文件:picture6.jpg.jpg
- picture2.jpg.jpg
- picture9.jpg.jpg
- picture3.jpg.jpg
-
你将如何删除重复的扩展?
最终结果:
- picture2.jpg
- picture9.jpg
- picture3.jpg
- picture6.jpg
我熟悉重命名,但我很好奇重命名仍然适用于删除重复的扩展?在bash中删除双重扩展
说我有一个名为几个文件:picture6.jpg.jpg
你将如何删除重复的扩展?
最终结果:
假设:
.jpg.jpg
执行这一(非递归)然后下面的脚本将工作:
#!/bin/bash
for file in *.jpg.jpg
do
mv "${file}" "${file%.jpg}"
done
说明:
${file%.jpg}
:这部分被称为Parameter Subsitution../clean_de.sh
clean_de.sh
新的文件,它由chmod +x clean_de.sh
要使用该脚本
警告的A注:
正如@gniourf_gniourf所指出的那样,使用-n
选择,如果您的mv
支持它。
否则 - 如果你在同一个目录有a.jpg
和a.jpg.jpg
,它会重命名a.jpg.jpg
到a.jpg
并在此过程覆盖现有a.jpg
没有警告。
一号线rename命令也应该足够了(你的情况下,至少):
rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg
下面是这个问题比较笼统,但还是简单的解决方案:
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
- 实际重命名文件
发行说明:因为它是一个简单的行脚本,你可以找到未处理的案件。在文件名中带有额外点的文件,超深度目录结构等。
这正是我需要的谢谢。我会假设是%\正在做这个改变? –
如果你的'mv'有'-n'选项(没有clobber选项),你可以使用它,只是为了在目标文件已经存在的情况下安全。 –