
setfattr
フリーテキスト コメントに対応する拡張属性を設定するための、少し便利な形式で単純にラップする短いシェル スクリプトを作成しました。
#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -d -m '^user.xdg.comment$' "$1"
US ASCII コメントを xattrs として保存する場合、これはうまく機能します。ただし、US ASCII 以外の文字を含むコメントを設定しようとすると、Base64 でエンコードされたデータと思われるものが返されます。
$ touch xyz
$ set-comment xyz åäöåä
# file: xyz
user.xdg.comment=0sw6XDpMO2w6XDpA==
$
しかし、Base64だけではありません。
$ printf "0sw6XDpMO2w6XDpA==" | \base64 --decode
��:\:L;l:\:@base64: invalid input
$
ほとんどの場合、私はただランダムに見えるゴミが返されます。時々、このように、Base64 デコーダーが「無効な入力」を返します。
この文字列は何ですか?元の入力値との関係はどのようなものでしょうか?この場合のgetfattr
ように、元の入力値に戻すにはどうすればよいのでしょうか?åäöåä
setfattr --version
私のシステムでは、 と応答しますsetfattr 2.4.46
。Debian Wheezy によってパッケージ化されたバージョンを実行しています。問題になる可能性は低いですが、私は標準の Wheezy カーネルで ZFS On Linux 0.6.3 (0.6.2 でも同じ動作を確認) を実行しています。
答え1
この質問を読んでちょっと興味が湧いたので、ちょっとやってみましょう「法医学」:
まず反対のことを試します:
åäöåä
Base64 ではどのようにエンコードされますか?
$ echo åäöåä | base64
w6XDpMO2w6XDpAo=
これは明らかに、あなたが持っている とよく似ています。先頭に0sw6XDpMO2w6XDpA==
余分なものがあり、末尾は完全に一致していません。 の末尾の改行( によって自動的に挿入されます) を抑制すると、次のようになります。0s
åäöåä
echo
$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==
これは、先頭をuser.xdg.comment
除いてまさに -値です。0s
結論
コメントはBase64 でエンコードされ、 というプレフィックスが付けられ0s
、他のいくつかの文字列をテストすると、これが確認されます。
例:
$ ./set-comment xyz 日本語
# file: xyz
user.xdg.comment=0s5pel5pys6Kqe
$ base64 -d <<<'5pel5pys6Kqe' ; echo
日本語
( は、; echo
の出力がbase64
改行で終わらないため、次のプロンプトを混乱させないようにするためのものです。)
しかし...
これは、このような場合 (コメントが ASCII 以外の場合) に、コメントが Base64 でエンコードされ、プレフィックスが付けられることを示しています0s
。
「本当の」答え
これを行った後、私は man ページをチェックするという素晴らしいアイデアを思いつきました。getfattr
そこには、次のようなことが書かれています。
オプションに関して-e en, --encoding=en
値を取得した後、エンコードします。en の有効な値は、「text」、「hex」、および「base64」です。テキスト文字列としてエンコードされた値は二重引用符 (") で囲まれ、16 進数および base64 としてエンコードされた文字列にはそれぞれ 0x と 0 がプレフィックスとして付けられます。
したがって、スクリプトを次のように変更します。
(ファイルコメント設定:)
#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -e text -d -m '^user.xdg.comment$' "$1"
属性は常にテキストとして出力されます。たとえば、次のようになります。
$ ./set-comment xyz åäöåä # with fixed script
# file: xyz
user.xdg.comment="åäöåä"
ただし、まだいくつかの注意点が残っています...たとえば:
$ ./set-comment xyz 0x414243
# file: xyz
user.xdg.comment="ABC"
そして
$ ./set-comment xyz 0s5pel5pys6Kqe
# file: xyz
user.xdg.comment="日本語"
出力が入力と一致しない。
これらは、議論を「調整」して、setfattr
好みの形にすることで修正できます。を参照してくださいman setfattr
。