コマンドラインを使用してファイル名をデコードする方法は?

コマンドラインを使用してファイル名をデコードする方法は?

コマンドラインでファイル名をデコードできますか?

次の2つのファイルがあるとしましょう。

  • foo.mp3
  • Bar.mp3

ファイル名をUTF-8値にデコードできるコマンドラインツールはありますか?

  • 0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33
  • 0x62 0x61 0x72 0x2E 0x6D 0x70 0x33

答え1

16進バイト値を取得する標準(POSIX / Unix)コマンドはですod

file=foo.mp3
printf %s "$file" | od -An -vtx1

出力は次のようになります。

 66 6f 6f 2e 6d 70 33

$file上記にはすべての配列が含まれています(除算用zsh)。バイト。文字エンコーディングは考慮されません。

$file配列を含めたい場合数値(ロケールエンコーディングで)各文字のUnicodeコードポイントを16進数で取得するには、Little-Endianシステムで次のようにします。

printf %s "$file" | iconv -t UTF-32LE | od -An -vtx4

また見なさい:

printf %s "$file" | recode ..dump

または:

printf %s "$file" | uconv -x hex/unicode
printf %s "$file" | uconv -x '([:Any:])>&hex/unicode($1)\n'

次の文字のバイト値をUTF-8でエンコードされた16進数で必要な場合:

printf %s "$file" | iconv -t UTF-8 | od -An -vtx1

これはASCII文字のみを含む同様のコンテンツとfoo.mp3同じです。

答え2

そしてperl

$ perl -CA -le 'print join " ", map { sprintf "0x%X", $_ } unpack "U*" for @ARGV' \
  foo.mp3 bar.mp3 cường
0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33
0x62 0x61 0x72 0x2E 0x6D 0x70 0x33
0x63 0x1B0 0x1EDD 0x6E 0x67

これらのファイル名のリストをファイルに保存すると、次のようになります。

perl -CI -lne 'print join " ", map { sprintf "0x%X", $_ } unpack "U*"' <file

答え3

私はこれが単純なPerlスクリプトで行うことができると思います:

perl -we 'foreach my $file (glob("*")) { 
   printf "0x%02X ", ord($_) foreach split//, $file; print "\n" }; '

ディレクトリにファイルが含まれていて、foo.mp3結果が出力に似ている場合bar.mp3

0x62 0x61 0x72 0x2E 0x6D 0x70 0x33 
0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33 

glob()(名前をソートしたいです。)

説明する:

foreach my $file (glob("*")) {   # loop over all filenames in current directory 
    printf "0x%02X ", ord($_)    # take the character as a number, and print in hex
      foreach split//, $file;    # .. after splitting the filename to characters
    print "\n";                  # add a newline
}

(*点で始まるものを除く)

これは、ファイルシステムに保存されているファイル名の実際のバイトのみを印刷します。ファイル名がUTF-8ではない場合、スクリプトはそれを変換しません。

あるいは、ファイル名のリストに加えて他のデータを処理するlsパイプなどの操作を実行することもできます。odxxdすべての質問読み取り機能が含まれているlsため、ファイル名を別の行に分割するのは困難です。

答え4

一般的なBashの使用:

a=abcdefghij    
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done
6162636465666768696A

printf必要に応じてフォーマットをカスタマイズしてください。

関連情報