我熟悉重命名,但我很好奇重命名仍然適用於刪除重複的擴展?在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選項),你可以使用它,只是爲了在目標文件已經存在的情況下安全。 –