【Linux】convmvコマンドでファイル名の文字コードや大文字・小文字を変換する

目次

概要

ファイルの中身ではなく、「ファイル名」自体の文字コードを変換するためのコマンドです。

Windows (Shift_JIS/CP932) やMac (UTF-8 NFD) で作成されたファイルをLinux (UTF-8 NFC) に転送した際に発生する、「ファイル名の文字化け」を解消するのに特化しています。また、ファイル名の大文字・小文字を一括変換する機能も備えています。

※標準ではインストールされていないことが多いため、以下のコマンド等で追加する必要があります。

sudo apt install convmv または sudo dnf install convmv

仕様(引数・オプション)

構文

convmv [オプション] -f [変換元コード] -t [変換先コード] [ファイル名/ディレクトリ名...]

主な引数・オプション

オプション説明
-f [コード]変換元の文字コードを指定します(from)。例: shiftjis, utf8
-t [コード]変換先の文字コードを指定します(to)。例: utf8
–notest実際にファイル名を変更します(デフォルトはテストモードで表示のみ)。
-rディレクトリを再帰的にたどって処理します。
-i変換時に同名ファイルが存在する場合、上書き確認を行います(interactive)。
–listサポートしている文字コードの一覧を表示します。
–replaceターゲットファイルが既に存在する場合、上書きします。
–upperファイル名をすべて大文字に変換します。
–lowerファイル名をすべて小文字に変換します。
–exec [コマンド]変換が成功したファイルに対して、指定したコマンドを実行します。

基本の使い方

まずはオプションを指定せず、**「テストモード(Dry Run)」**で変換結果をシミュレーションします。convmv は安全のため、デフォルトでは実際の変更を行いません。

Windowsから持ってきた文字化けファイル(Shift-JIS)がある想定です。

# まずはテスト実行(--notest無し)で、どう変わるか確認
convmv -f shiftjis -t utf8 win_data_?????.txt

実行結果例

Starting a dry run without changes...
mv "./win_data_ƒeƒXƒg.txt"      "./win_data_テスト.txt"
No changes to your files done. Use --notest to finally rename the files.

変更後のファイル名が正しく読めていることを確認したら、--notest を付けて実際に変換します。

# 実際にファイル名を変更
convmv -f shiftjis -t utf8 --notest win_data_?????.txt

実践コマンド

ディレクトリ以下の全ファイルをShift-JISからUTF-8に変換

再帰的に処理する -r オプションを使い、フォルダごとのアップロードデータなどを一括修正します。

# public_html ディレクトリ以下の全ファイルを対象に変換
convmv -r -f shiftjis -t utf8 --notest public_html/

ファイル名をすべて小文字(または大文字)に統一する

Webサーバーでの公開時など、大文字・小文字の混在トラブルを防ぐために統一する場合に使用します。文字コードの指定は不要です。

# カレントディレクトリの全ファイル名を小文字に変換
convmv --lower --notest *

# 特定のファイルを大文字に変換
convmv --upper --notest index.html

実行結果例(小文字化)

mv "./README.TXT"      "./readme.txt"
mv "./Image.PNG"       "./image.png"
Ready!

カスタムポイント

  • 文字コードの確認 (–list)使用できるエンコーディング名は正確に指定する必要があります。リストから grep で探すと確実です。Bashconvmv --list | grep -i jis # shiftjis, euc-jp, iso-2022-jp 等が表示される
  • 上書き確認 (-i)変換の結果、既存のファイルと同名になってしまう場合に備え、慎重に作業したい場合は -i を付けます。Bashconvmv --lower -i --notest *

注意点

  1. デフォルトは変更しないconvmv は –notest オプションを付けない限り、絶対にファイル名を変更しません。「コマンドを打ったのに変わらない」というときは、このオプション忘れが原因です。2. ファイルの中身は変わらないこのコマンドはあくまで「ファイル名(メタデータ)」を書き換えるツールです。テキストファイルの中身の文字コード変換には iconv や nkf を使用してください。
  2. 不可逆な操作一度文字コードを変換してしまうと、元のコードが何だったか分からなくなる場合があります。重要なデータはバックアップを取ってから操作してください。

応用

Mac (NFD) の濁点分離ファイルをLinux (NFC) 用に修正する

Macで作成したファイル(「カ」と「゛」が分かれるNFD形式)を、LinuxやWindowsで標準的なNFC形式に結合します。文字化けではありませんが、検索などで不具合が出る場合に有効です。

# UTF-8からUTF-8への変換とし、NFC正規化オプション(--nfc)を使用
convmv -r -f utf8 -t utf8 --nfc --notest /mnt/mac_disk/

まとめ

convmv は、OS間のファイル転送で必ずと言っていいほど発生する「ファイル名文字化け問題」の特効薬です。

「まずはオプションなしで確認し、–notest で確定させる」という2段階の安全装置があるため、安心して利用できます。Webサーバーへのデプロイ前や、古いファイルサーバーの移行時に活用してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次