findとxargsを使用してmd5ベースのターゲット名を持つファイルをコピーする

findとxargsを使用してmd5ベースのターゲット名を持つファイルをコピーする

私は多くを含むディレクトリツリーを持っています。.datファイルには特殊文字がたくさん含まれています。 ASCII文字を含むファイルのみを処理できる他のプロセスによって使用されます。

私の考えは、findすべてのファイルをインポートし、ファイルパスのmd5ハッシュに基づいて新しいファイル名を作成して新しいディレクトリにコピーすることです(それらはそれほど大きくなく、元のディレクトリを変更しないことです)。

私が試したことは次のとおりです。

find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"

残念ながら、ハッシュのみをビルドし、すべてのファイルを対応する出力ファイル名にコピーします。

$ touch dat/foo.dat
$ touch dat/bar.dat
$ find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"
$ ls datnew
bbe02f946d5455d74616fc9777557c22.dat

私の間違いが何であるか教えてもらえますか?私がxargs間違って使っているのではないでしょうか?

ベストアンサー1

file説明されていないため、回避$( echo $file | md5 )策が必要です。

1つの可能性は、単にループに入力し、while各出力を読み取ることです。この場合、xargs全体的にスキップすることをお勧めします。

find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done

これを使用するには、-print0次のコマンドを使用してヌル文字を改行に置き換えます。tr

find ... -print0 | tr '\000\' '\n' | while read ; do ... ; done

おすすめ記事