ファイル名サニタイザー

ファイル名のリストを貼り付けると、どのOS、どのZIPアーカイブ、どのCDNのパスでも生き残るきれいなバージョンが返ってきます。サニタイザーはアクセント付きの文字をプレーンなASCIIに変換し、Windowsで壊れる文字(\ / : * ? " < > |)を取り除き、制御文字を削除し、空白をまとめ、禁止された並びを選んだ置換文字(既定:ハイフン)に置き換えます。S3への一括アップロード前、教材ZIPの出荷、古いNASからの写真のインポートの修正などに便利です。

ファイル名をサニタイズする方法

  1. 1

    ファイル名を貼り付ける

    1行に1つ、拡張子の有無は問いません。拡張子はそのまま保持されます。

  2. 2

    置換文字を選ぶ

    安全でない並びを置き換える文字を選びます。ハイフン(`-`)が最も安全な既定で、アンダースコア(`_`)はレトロな選択です。

  3. 3

    サニタイザーを実行

    各名前はトリムされ、ASCIIに変換され、禁止文字が取り除かれ、空白がまとめられます。何も残らなければ`file`になります。

  4. 4

    リネーム前に確認

    出力にはきれいになった名前だけが並ぶので、その場でリネームする前に衝突(2つの入力が同じ出力になる)がないか確認してください。

何が安全でなく、なぜか

ファイルシステムやツールによってブラックリストは異なります。安全なクロスプラットフォームの共通部分は、多くの人が思うより狭いものです。

ファイル名を安全でなくする文字とパターン

項目 安全でない理由
\ / : * ? " < > | Windows(NTFS、FAT)で禁止。
ASCII制御文字 0x00-0x1F ほとんどのファイルシステムで不正。シェルスクリプトを壊す。
先頭・末尾の空白 Windowsでひそかに除去される。見えないバグ。
末尾のドット Windowsでひそかに除去される。
予約名 CONPRNAUXNULCOM1..9LPT1..9、すべてWindowsでブロック。
Unicode結合文字 cafécaféと同じに見えるが、一部のシステムでは別のファイル名になる原因。
絵文字・ピクトグラフ字形 現代のシステムでは生き残るが、古いCIパイプラインやCDNのパスを壊す。

適用される正規化の手順

  1. ASCII変換。 アクセント付きの文字は基本の文字になります。cafécafeに、naïvenaiveになります。ASCII相当がない文字(CJK、絵文字)は削除されます。
  2. 禁止文字の置き換え。 \ / : * ? " < > |と制御文字は、選んだ置換文字(既定:ハイフン)になります。
  3. 空白のまとめ。 連続する空白とタブが1つの置換文字になります。
  4. 端のトリム。 先頭と末尾のドットと置換文字は削除され、空になった結果はfileになります。
  5. 拡張子は保持。 名前の途中のドットは置き換えられないので、.pdf.jpg.tar.gzは生き残ります。削除されるのは末尾のドットだけです。

コツ

  • 拡張子を保つ。 名前の途中のドットは保持されるので、.pdf.jpg.tar.gzはそのまま残ります。
  • 衝突を確認する。 アクセントは必ず変換されるので、Résumé.pdfResume.pdfはどちらもresume.pdfになります。その場でリネームする前に出力を確認してください。
  • Webのパス。 URLでは、サニタイズの後にパーセントエンコードもします、あるいはより良くは、URLのスラッグを[a-z0-9-]の部分集合に保ち、エンコードが一切不要にします。

よくある質問

Web資産とクロスプラットフォームのZIPには、はい、大文字小文字を区別しないWindowsサーバーにアップロードされ、区別するLinuxのCDNからリンクされるときの微妙なバグを避けます。サニタイザーは大文字小文字を変えないので、必要なら自分で小文字にしてください。ローカルの作業では好みです。

空白はすべての現代のOSで合法ですが、URLエンコード(%20)を強制し、多くのシェルパイプラインを壊し、古いツールを混乱させます。ハイフンに置き換えると、バグの一カテゴリーをまるごと取り除けます。

サニタイザーは常にプレーンなASCIIを出力します。アクセント付きの文字は変換され(cafécafe)、キリル文字はラテン文字の近似に変換され、ASCII相当がない文字(CJK、タイ語、絵文字)は削除されます。対象の環境で元の非ラテン文字の名前が必要なら、別のファイルに控えを残してください。

いいえ、リストはリクエスト中にメモリ内でサニタイズされ、その後どのログにも保存・書き込みされません。

関連ツール

このツールは他の言語でも利用できます