私は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番目の名前echo
をmv
。
説明する
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/.*\.//')
別のフォルダでファイル名を繰り返し変更する必要がある場合は、find
with-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
スクリプトはmd5sum
GNU coreutilsのユーティリティを使用して、指定されたパス名のデフォルト名(拡張子なし)に基づいてMD5ハッシュを計算します。ヘルパー関数はmd5name
実際の計算を実行し、フルパスと拡張子とともに新しい名前を出力します。
この関数は、指定されたパス名の部分合計結果に基づいて新しい名前を組み合わせるためにmd5name
使用されます。awk
md5sum
機能自体の使用例:
$ md5name '/some/path/file name here.extension'
/some/path/c9e89fa443d16da4b96ea858881320c9.extension
...c9e89fa443d16da4b96ea858881320c9
文字列のMD5ハッシュはどこにありますかfile name here
?
echo
実際にファイル名を変更するには、上部のスクリプトから削除してください。echo
ある時点でファイル名を元の名前に復元する必要がある場合は、元のスクリプトの出力をファイル(現在の場所)に保存できます。
これを実行することに注意してください二重MD5ハッシュのMD5ハッシュはファイルセットから計算され、スクリプトを実行するたびに名前付きファイルを注意深く記録しないと元のファイル名を回復できなくなります。
答え3
と一緒に:perl
rename
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
正常に動作します。sum
read
明らかに[echo]
、これは実際に実行されたときに削除する必要がありますが、検索をテストするために実行する前に常にスクリプトの変更をテストすることをお勧めします。
これはすべてあなたが実行していると仮定しますbash
。または、1つの長い行で入力することもできます。
find -iname \*.jpg -exec md5sum '{}' ';' | while read sum file ; do mv "$file" "`dirname $file`/$sum".jpg ; done