作者 主題: 錯誤副檔名的修正[已解決]  (閱讀 2216 次)

0 會員 與 1 訪客 正在閱讀本文。

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
錯誤副檔名的修正[已解決]
« 於: 2017-04-11 14:34 »
我的遇到的問題是,有5000張的圖檔,有jpg、png,但其中很多副檔名都亂了,如有些原是png檔卻用了jpg副檔名,有些原是jpgp檔卻用了png副檔名,但有些又是正確的。我想一次找出並還原本來的副檔名,參考了這個網站http://askubuntu.com/questions/631900/correct-file-extensions,但其指令有誤,grep參數-aPo有誤,grep的參數好像沒有P,懇求解惑,感謝
« 上次編輯: 2017-04-25 18:31 由 john0221 »

dark

  • 俺是博士!
  • *****
  • 文章數: 1529
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #1 於: 2017-04-11 16:48 »
剛好有
# file /all_mount/sda/tmps/png/256_01.png
/all_mount/sda/tmps/png/256_01.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced
# file /all_mount/sda/tmps/png/3651/S.ico
/all_mount/sda/tmps/png/3651/S.ico: MPEG sequence


代碼: [選擇]
#name2='jpg$|jpeg$|png$|gif$'
#findf=$(find /tmp | grep -iE "$name2")

#for f in $findf ; do
#...
#done
嗯 ... 這方法不好 , 路徑檔名可能有空白
代碼: [選擇]
find /tmp | grep -iE 'jpg$|jpeg$|png$|gif$' | while read f;do
   ans=$(file "$f")

   if [ "$(echo $ans | grep 'image data')" != "" ] ; then
      # 再 grep 一次避免意外
      newname2=$(echo $ans | awk '{print $2}' | grep -iE 'jpg$|jpeg$|png$|gif$')
      # 想全小寫
      #newname2=$(echo $newname2 | sed 's/[A-Z]/\l&/g')
   fi

   if [ "$newname2" != "" ] ; then
        mv "$f" "$(echo "$f" | sed 's/\.[a-zA-Z]\{1,4\}$//')'.'$newname2" && echo ok || echo 'the same'
   else
       echo "$f"
   fi
done

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #2 於: 2017-04-12 14:43 »
在本目錄執行,是不是改成如下?謝謝

find | grep -iE 'jpg$|jpeg$|png$|gif$' | while read f;do
   ans=$(file "$f")
   if [ "$(echo $ans | grep 'image data')" != "" ] ; then
      # 再 grep 一次避免意外
      newname2=$(echo $ans | awk '{print $2}' | grep -iE 'jpg$|jpeg$|png$|gif$')
      # 想全小寫
      #newname2=$(echo $newname2 | sed 's/[A-Z]/\l&/g')
   fi
   if [ "$newname2" != "" ] ; then
        mv "$f" "$(echo "$f" | sed 's/\.[a-zA-Z]\{1,4\}$//')'.'$newname2" && echo ok || echo 'the same'
   else
       echo "$f"
   fi
done

執行後提示find參數說明usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #3 於: 2017-04-12 14:46 »
for f in *.{jpg,JPG,png,PNG,jpeg,JPEG}; do
    type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
    mv "$f" "${f%%.*}.${type,,}" 
done

以上的code錯在哪裡呢?謝謝

dark

  • 俺是博士!
  • *****
  • 文章數: 1529
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #4 於: 2017-04-13 08:15 »
find 後面要加路徑參數

for 那個欄位是放變數
您希望用正規表示式?


john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #5 於: 2017-04-13 09:27 »
感謝回覆~
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+') 這一行我研究不出來,grep後面這段看不懂
懇請dark兄解惑,謝謝~

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #6 於: 2017-04-13 09:47 »
另外,以下是提供的code執行結果,我是不是那裡弄錯?

dark

  • 俺是博士!
  • *****
  • 文章數: 1529
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #7 於: 2017-04-13 11:19 »
看來咱們 OS 不同
您 file 一個圖檔看看 , 可能沒有 "image data" 字眼喔 ...
也或許副檔名不在第二個欄位喔 ... => awk '{print $2}' , 以空白分欄位

至於 file 跟 grep 參數 , 您可 --help 看看
小弟一般不太使用那些指令的子參數 , 大多搭配其他指令來達到要求


ps ..
您看我第一篇
試了兩種檔案才決定抓字眼跟欄位
不知道字型檔要是不小心副檔名是 jpg 會不會錯亂 ...

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #8 於: 2017-04-13 12:38 »
抱歉,我是用mac系統,在終端機下使用
file檔案後,真的沒image data

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正
« 回覆 #9 於: 2017-04-25 18:30 »
經過幾天的摸索,終於完成 ;D
回復原始的副檔名,順便將副檔名改為小寫

for f in *.*; do
type=`echo $(file "$f" | awk '{print $2}') | tr '[:upper:]' '[:lower:]'`
mv $f ${f%%.*}.$type
done

也可以
for f in *.*; do
type=`echo $(file "$f" | awk '{print $2}') | tr '[A-Z]' '[a-z]'`
mv $f ${f%%.*}.$type
done


${f%%.*}是空檔名,$type是副檔名
$(file "$f" | awk '{print $2}')是取出其屬性,影像格式屬性在第二欄
| tr '[A-Z]' '[a-z]是將大寫轉小寫
« 上次編輯: 2017-04-25 18:32 由 john0221 »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17331
    • 檢視個人資料
    • http://www.study-area.org
Re: 錯誤副檔名的修正[已解決]
« 回覆 #10 於: 2017-05-03 20:16 »
下面這個要小心:
mv $f ${f%%.*}.$type

如果檔案名稱含多個小數點的話,只會保留第一個點左邊的部份,
建議用一個 % 就好...

john0221

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
Re: 錯誤副檔名的修正[已解決]
« 回覆 #11 於: 2017-05-09 09:32 »
謝謝提醒!又學一招 :D