0

複数のJavaファイルのmd5sumをテキストファイルに保存しようとしていますが、見たところ、ファイル自体ではなくパスのmd5sumが作成されます。

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        echo -n $line | md5sum.exe | cut -d' ' -f1 | tr -d '\n' >> $FileName
        echo -n "-" >> $FileName
        echo -n $line | cut -d' ' -f2 >> $FileName
    fi
done

また、最後の改行以外の改行を削除しようとしています。md5sum のパスを存在しないファイルに変更しても、md5sum が作成されます。(私はMINGWシェルを使用しています)

4

2 に答える 2

1

md5sum とファイル名を形式のファイルに出力することだけが心配な場合は、パターン展開部分文字列抽出md5sum-filenameを使用して、ファイルの md5sum を読み取り (存在する可能性がある場合)、パス情報を削除して、ファイルのみを残すことができます。出力する名前:

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        md5str="$(md5sum "$line")"
        sum=${md5str%% *}
        sumfn=${md5str##* }
        sumfn=${sumfn##*/}

        echo "$sum-$sumfn" >> $FileName
    fi
done
于 2014-09-04T07:29:56.537 に答える
1

実際、md5sumファイル名がない場合、標準入力からそのデータ (引数ではなく) を読み取り、そのチェックサムを計算します。

接線的にecho filename | xargs md5sumは、標準入力から引数を読み取る必要がある場合の回避策です。

しかし、ここでは、それをしたい理由はありません。

find "$FilesDirectory" -type f -iregex '.*\.java' \
    -exec md5sum + |
sed 's%  *.*/%-%' >"$FileName"

は、見つかったすべてのファイルを-type f置き換えif [ -f ...-exec ... +実行します。md5sum次に、出力を後処理して、チェックサムの後に一連のスペースの代わりにダッシュを配置します。正規表現は、スペース、次に最後のスラッシュまでの任意の文字に一致し、すべてを置き換えます。したがって、パス名も削除されます。

(古いバージョンの をfindお持ちの場合は、代わりに使用する必要がある場合があります-exec md5sum {} \;。)

すべてのファイルが現在のディレクトリにあり、ワイルドカードに一致するディレクトリがなく (この場合-type f、上記も不要です)、ワイルドカードが長すぎる文字列に展開されるほど多くのファイルがない場合 ( 「引数リストが長すぎます」)あなたは簡単に行うことができます

md5sum *.[jJ][aA][vV][aA] | ...

を使用する必要があり、findサブディレクトリがあるがそれらを走査したくない場合は、 を追加し-maxdepth 1ます。

于 2014-09-04T06:32:24.557 に答える