ディレクトリ内のすべてのファイル名をそのファイル名の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オプションを使用してください。

答え2

#!/bin/bash

md5name () {
    local base=${1##*/}
    local ext=${base##*.}
    local dir=${1%/*}

    printf '%s' "${base%.$ext}" | md5sum |
    awk -v dir="$dir" -v ext="$ext" '{ printf("%s/%s.%s\n", dir, $1, ext) }'
}

dir=$HOME  # where your files are

for pathname in "$dir"/*; do
    test -f "$pathname" || continue
    echo mv "$pathname" "$( md5name "$pathname" )"
done

このbashスクリプトはmd5sumGNU coreutilsのユーティリティを使用して、指定されたパス名のデフォルト名(拡張子なし)に基づいてMD5ハッシュを計算します。ヘルパー関数はmd5name実際の計算を実行し、フルパスと拡張子とともに新しい名前を出力します。

この関数は、指定されたパス名の部分合計結果に基づいて新しい名前を組み合わせるためにmd5name使用されます。awkmd5sum

機能自体の使用例:

$ md5name '/some/path/file name here.extension'
/some/path/c9e89fa443d16da4b96ea858881320c9.extension

...c9e89fa443d16da4b96ea858881320c9文字列のMD5ハッシュはどこにありますかfile name here

echo実際にファイル名を変更するには、上部のスクリプトから削除してください。echoある時点でファイル名を元の名前に復元する必要がある場合は、元のスクリプトの出力をファイル(現在の場所)に保存できます。

これを実行することに注意してください二重MD5ハッシュのMD5ハッシュはファイルセットから計算され、スクリプトを実行するたびに名前付きファイルを注意深く記録しないと元のファイル名を回復できなくなります。

答え3

と一緒に:perlrename

find . -name '*.jpg' -type f -exec rename -n '
  BEGIN{use Digest::MD5 qw(md5_hex)}
  my ($dir, $name, $ext) = m{(.*)/(.*)\.(.*)}s;
  $_ = "$dir/" . md5_hex($name) . ".$ext"' {} +

(幸せなら削除 -n)。

答え4

1つのAWK方法の場合:

find [Directory] -type f [various other find options] | 
     awk '{orig=$0; 
           match($0,/^.*\//,path); sub("^"path[0], "");
           match($0, /.[[^.]+$/,ext); sub(ext[0]"$", "");
           ("echo \"" $0 "\"|md5sum") | getline;
           com=sprintf("mv \"%s\" \"%s%s%s\"", orig, p[0], $1, ext[0]);
           print(com)
           }'

find最新のコマンドは入力ディレクトリを必要としないと仮定するため、.[ディレクトリ]を空白のままにできます。ディレクトリが好きではなく、実行時にディレクトリ名を変更するのは良い考えではないので、-type f便利な検索ファイルしかありません。特定のファイルのみを使用するには、を使用し、大文字と小文字が重要な場合は代わりにを使用してください。md5sum-iname pattern-iname \*.dat-name-iname

これらのmatch(...); sub(...)フラグメントは、ファイル名の一部を抽出して入力文字列で置き換えます。 [pre/app]"^"と追加は、"$"パス/拡張子を重複する可能性のある文字列の置き換えを防ぐためです。

実際に名前を変更することに変更してください。たとえば、次のようになりprint(com)ます。system(com)

find -type f | 
     awk '{orig=$0; 
           match($0,/^.*\//,path); sub("^"path[0], "");
           match($0, /.[[^.]+$/,ext); sub(ext[0]"$", "");
           ("echo \"" $0 "\"|md5sum") | getline;
           com=sprintf("mv \"%s\" \"%s%s%s\"", orig, p[0], $1, ext[0]);
           system(com)
           }'

md5sum実際のファイル名を名前として使用したい場合md5sum出力合計と入力ファイル名が次のようになることを利用できます。

 find -type f -exec md5sum '{}' ';' | 
     while read sum file ; do 
       [echo] mv "$file" "`dirname $file`/$sum".extension ; 
     done

while read sum fileコマンドの結果である2つのパラメータを取得し、割り当てとmd5sum変数sumに使用します。空白があってはいけないので、file正常に動作します。sumread

明らかに[echo]、これは実際に実行されたときに削除する必要がありますが、検索をテストするために実行する前に常にスクリプトの変更をテストすることをお勧めします。

これはすべてあなたが実行していると仮定しますbash。または、1つの長い行で入力することもできます。

find -iname \*.jpg -exec md5sum '{}' ';' | while read sum file ; do mv "$file" "`dirname $file`/$sum".jpg ; done

関連情報