Command-Line

將目錄中的所有文件重命名為其文件名的 md5 雜湊(不是內容)

  • December 8, 2021

我對 linux / 命令行非常陌生,需要加密 10K+ 文件的名稱(唯一名稱),以便它們與 mySQL 數據庫中的 MD5 加密名稱匹配。

我已經看到如何重命名文件目錄以及如何獲取文件的雜湊值(mdsum?),但我一直堅持如何獲取文件名的雜湊值,然後將該文件重命名為生成的雜湊值保留擴展即

mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg 

似乎它應該是一個簡單的重命名或mv行,但我無法理解它。

非常感謝您的見解

PS 我已經在幾個接近我正在尋找的範例中看到了 Perl 函式的使用,但不知道在哪裡/如何使用這些函式。

你沒有說你想使用哪個 shell,所以我只是假設Bash - 答案需要調整才能與其他 shell 一起使用。

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 和並將其輸出。使用它來檢查功能,如果你想開始重命名替換第二echomv

解釋

  • echo -n "$i" | md5sum– 計算包含文件副檔名 ( Piping ) 的完整文件名的 md5 總和,以將副檔名更改剝離為以下之一:echo -n "$i"
${i%%.*}
sed 's/\..*//' <<< "$i"
echo "$i" | sed 's/\..*//'
  • sum=$(…)– 執行並保存輸出$sum命令替換
  • ${sum%% *}– 輸出所有內容,直到第一個空格(Parameter Substitution),與以下之一相同:
$(sed 's/ .*//' <<< "$sum")
$(echo "$sum" | sed 's/ .*//')
  • ${i##*.}– 輸出最後一個點之後的所有內容(參數替換),與以下內容之一相同:
$(sed 's/.*\.//' <<< "$i")
$(echo "$i" | sed 's/.*\.//')

如果您需要遞歸地重命名不同文件夾中的文件,請使用find-exec選項。

引用自:https://unix.stackexchange.com/questions/392129