コマンドラインでファイル名をデコードできますか?
次の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
パイプなどの操作を実行することもできます。od
xxd
すべての質問読み取り機能が含まれているls
ため、ファイル名を別の行に分割するのは困難です。
答え4
一般的なBashの使用:
a=abcdefghij
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done
6162636465666768696A
printf
必要に応じてフォーマットをカスタマイズしてください。