ディレクトリ内のすべてのファイル名をそのファイル名のmd5ハッシュ(コンテンツではない)に変更します。

ディレクトリ内のすべてのファイル名をそのファイル名のmd5ハッシュ(コンテンツではない)に変更します。

私はLinux/コマンドラインに初めてアクセスし、10,000を超えるファイルの名前(固有の名前)を暗号化してmySQLデータベースのMD5暗号化された名前と一致させる必要があります。
ファイルディレクトリの名前を変更する方法とファイルのハッシュを取得する方法を見つけました(mdsum?)しかし、ファイル名のハッシュを取得し、そのファイルの名前を生成されたハッシュに置き換えて拡張子を保持する方法がブロックされました。

mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg 

簡単な名前を変更または減らす必要があるようですが、mv理解できません。
あなたの洞察力に心から感謝します。

PS:私が探しているものに似たいくつかの例では、Perl関数が使用されているのを見ましたが、それをどこで/どのように使用するのかわかりません。

ベストアンサー1

どのシェルを使いたいのか言っていないので、ただ想定しています。吹く- 他のシェルと連携するには、回答を調整する必要があります。

for i in *; do sum=$(echo -n "$i"|md5sum); echo -- "$i" "${sum%% *}.${i##*.}"; done

スクリプトバージョン:

for i in *; do
  sum=$(echo -n "$i" | md5sum)
  echo -- "$i" "${sum%% *}.${i##*.}"
done

この単純なforループは、現在のディレクトリの各ファイルを取得し、そのファイル名のmd5合計を計算して出力します。これを使用して機能を確認し、名前の変更を開始するには、2番目の名前echomv

説明する

  • echo -n "$i" | md5sum– md5 合計を計算します。フルファイル名ファイル拡張子を含める(管路)、拡張子をecho -n "$i"次のいずれかに変更します。

    ${i%%.*}
    sed 's/\..*//' <<< "$i"
    echo "$i" | sed 's/\..*//'
    
  • sum=$(…)出力を実行し$sumコマンドの置き換え)

  • ${sum%% *}– 最初のスペース(パラメータの置換)これは次のいずれかと同じです。

    $(sed 's/ .*//' <<< "$sum")
    $(echo "$sum" | sed 's/ .*//')
    
  • ${i##*.}- 次のいずれかと同じように、最後の点(引数の置き換え)以降のすべての項目を出力します。

    $(sed 's/.*\.//' <<< "$i")
    $(echo "$i" | sed 's/.*\.//')
    

別のフォルダでファイル名を繰り返し変更する必要がある場合は、findwith-execオプションを使用してください。

おすすめ記事