2012-11-23 45 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 - 實際重命名文件

發行說明:因爲它是一個簡單的行腳本,你可以找到未處理的案件。在文件名中帶有額外點的文件,超深度目錄結構等。