私は分析のためにファイルシステムデータをデータベースに吸い込む必要がある恐ろしい状況に直面していました。このデータを抽出するために使用する方法の1つは、次のGNU findコマンドラインを使用することです。
find . -printf '__:__%M__:__%u__:__%g__:__%s__:__%Cs__:__%p\n'
これは__:__
理論的には、実際のファイルやディレクトリ名には表示されない区切り文字として機能します。
問題は、ファイルのクイックチェックサムが必要なため、cksumもマージする必要があるということです。
私は何ですか?考えるあなたがしなければならないことは、次のことをすることだけです:
find . -exec cksum {} \; -printf '__:__%M__:__%u__:__%g__:__%s__:__%Cs__:__%p\n'
これにより、これらすべてがファイルシステムを介した1行と1段階のプロセスになります。しかし、これは別の行にcksumを印刷します。
printfで利用可能な値として表示されるように-exec cksumを結合する方法はありますか?
これを行うのに最適なツールをお探しですか?他のツールを使用する必要がありますか?
ありがとうございます!
答え1
まず、いくつかの注意:
__:__
__:__
ファイルパスまたはパスの前に印刷されたフィールドには、ブロック文字や改行文字は表示されません。mkdir -p $'__:__/\n\n\n'
確認したい場合はお試しください。0以外のすべてのバイト値がファイルパスに表示されることがあります。バイトは文字を形成する必要もないため、ファイルパスは通常1行のテキストだけでなくテキストと見なすことはできません。通常、ファイルパスのリストを確実に表現するために、NULで区切られたレコードを使用します。
%u
そして%g
あなたにㅏファイルのuid / gidに対応するユーザー/グループ名。ユーザーIDは複数のユーザー名を持つことができ、uid 123のユーザー名は今日のユーザー名でも明日のユーザー名でもかまいません。つまり、取得する内容はファイル固有の情報ではなく、システムのユーザーデータベースに含まれる情報です。報告されるファイルの順序は
find
定義されていません。ディレクトリ階層の内容が変更された時期を検出できるようにすることが目標である場合は、リストを並べ替える必要があります。%Cs
これは秒単位でのみ精度を提供することに注意してください。%C@
完全な正確さのために。
ここで(zsh
または使用bash
)することができます。
find . -printf '%M/%U/%G/%s/%C@/%p\0' | LC_ALL=C sort -z |
while IFS=/ read -rd '' mode uid gid size ctime file; do
cksum=$(cksum < "$file") || continue
# do what to have to do with $mode $uid $gid $size $ctime $cksum $file
done
。より安定したチェックサムアルゴリズムを選択することもできますcksum
。
を使用するときは、上記の区切り記号以外の区切り記号をbash
選択することはできません。/
たとえば、を選択したが(末尾)というファイルが:
あると、、、、に分割され、末尾が失われます。これはPOSIXの要件です(zshでは無視されます)。出力ファイルパスの末尾に表示されないことが保証されています。./dir/file:
:
bash
read
mode:uid:gid:size:ctime:./dir/file:
mode
uid
gid
size
ctime
./dir/file
:
/
find
また、この-printf
述部はGNU実装に固有のものであり、find
移植可能ではありません。-z
テキストではなくデータを処理する機能もsort
GNUの拡張です。