
私は多くを含むディレクトリツリーを持っています。.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