間違った名前のファイルを適切な拡張子に変更するにはどうすればいいですか?

間違った名前のファイルを適切な拡張子に変更するにはどうすればいいですか?

さまざまな種類のファイルが入ったフォルダがあります。.pdf.jpg.png.tiffなどがあるが、すべて拡張子で命名されている。.JPGこれらすべてを元の拡張子で名前変更するにはどうすればいいでしょうか?pdfpdf口論口論等々。

ファイルの種類は次の方法で見つけることができます:

file 99.jpg
99.jpg: PDF document, version 1.3

これを実現できるスクリプトやプログラムはありますか?

答え1

次のようにして見つかった MIME タイプを使用できますfile:

#! /usr/bin/env bash
for f in ./*.JPG; do
    type=$(file -bi "$f")
    type=${type%%;*}
    base=${f%.*}
    final=
    case "$type" in
        application/pdf) final="$base".pdf ;;
        image/png)       final="$base".png ;;
        image/tiff)      final="$base".tiff ;;
    esac
    if [ "$final" ]; then
        printf '%s --> %s\n' "$f" "$final"
        # mv -f "$f" "$final"
    fi
done

case必要に応じてにさらにタイプを追加します(ただし、 JPEG ファイルには既に適切な拡張子が付いているため は除外します)。変更内容を確認し、結果に満足したら行のimage/jpegコメントを解除します。mv

答え2

  1. コマンドを生成するそれなし実行しています。

    コマンド文字列のリストを生成するために使用しmimetype、その後、GNU sed代わりの s指示:

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
       sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  2. ファイル拡張子が少しパントマイム-ish (つまり 、 など.jpegの代わりに) を使用する場合は、と の間に必要な.jpg数のコマンドを追加します。たとえば、次のようになります。ssed 's

    sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  3. 出力が良さそうなら、GNU sed評価する eオプションです。(e最後の の前にを置くだけです'。) 全体は次のようになります。

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
        sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#e'
    ls  # show results
    

関連情報