web-dev-qa-db-ja.com

一部のパスにスペースがある場合、再帰的なファイルリストからmd5ハッシュを作成する

1つのメインディレクトリ内にすべてのディレクトリとファイルのmd5ハッシュを作成する必要があります。私が成功するのを妨げている唯一のことは、パスにスペースがあるファイルを回避する方法を考え出すことです。

私は再帰的リストにfindを使用しています(findがこれを行う最良の方法であることを読みました):

c5-26-1# find /root/newdir
/root/newdir
/root/newdir/1
/root/newdir/2
/root/newdir/3
/root/newdir/4
/root/newdir/5
/root/newdir/newdir2
/root/newdir/newdir2/1
/root/newdir/newdir2/2
/root/newdir/new
/root/newdir/dir
/root/newdir/new dir

これをmd5で試してみると、2つの異なる結果が得られますが、どちらも機能しません。

c5-26-1# md5 $(find /root/newdir) # same outcome using for loop
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (dir) = 148538718feba14839f5d1072854c5f4

または

c5-26-1# find -X /root/newdir | xargs md5
find: /root/newdir/new dir: illegal path
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4

スペースのあるディレクトリをどのように説明しますか?

6
MaQleod

xargsは、一般的なツールが生成しない非常に特殊な方法で引用された入力を期待するため、ほとんど役に立ちません。また、mycommand $(find …)は、最初にすべてのファイル名を連結し、次に空白で分割するため、効果がありません。

find-execプライマリを使用して、引用符を必要とするシェルを介在させずにmd5を実行します。 findの実装が適度に最新である場合は、xargsで有名なこと、つまり引数のバッチごとに1回md5プログラムを呼び出すようにすることができます。

find /root/newdir -type f -exec md5 {} +

find-exec … {} +をサポートしていない場合は、+\;に置き換えてください。これにより、findは各ファイルに対して順番にmd5を呼び出します。少し遅いですが、どこでも利用できます。

これを正確に行う md5deep ツールを使用しないのはなぜですか?ほとんどのLinuxディストリビューションには、通常md5deepというパッケージに含まれています。

6
David Schwartz

-execスイッチをfindに使用すると、自動的にエスケープされると思います。

0
Tony