2011-02-18 66 views
7

我正在構建一個網站,我想哈希圖像的文件名。使用其文件名的sha1()哈希來重命名文件的腳本

如何創建一個bash腳本文件,以舊文件名的sha1重命名目錄中的每個文件?

我已經試過:

#!/bin/bash 
for file in * 
do 
    if [ -f "$file" ];then 
    newfile="openssl sha1 $file" 
    mv "$file" $newfile" 
    fi 
done 

但是,這並不工作:(

編輯

基於建議在這裏我嘗試這樣做:

#!/bin/bash 
for file in old_names/* 
do 
    if [ -f "$file" ];then 
    newfile=$(openssl sha1 $file | awk '{print $2}') 
    cp $file new_names/$newfile.png 
    fi 
done 

這會重命名文件,但我不確定它是什麼用來散列文件名。擴展是否被散列?路徑?

信息

那麼我將使用PHP的SHA1()函數來顯示圖像:

echo "<img src=\"images/".sha1("$nbra-$nbrb-".SECRET_KEY).".png\" />\n"; 
+0

定義`不起作用`。 – GolezTrol 2011-02-18 14:00:15

+0

文件名是否包含空格字符? – 2011-02-18 14:04:54

+1

'沒有被重命名'和'沒有' – Manu 2011-02-18 14:17:30

回答

6

到目前爲止,在您編輯的答案中的代碼示例將散列文件的內容。如果你想創建屬於前一文件名稱,不包括路徑或擴展名的文件名的哈希值,那麼做到這一點:

#!/bin/bash 
for file in old_names/* 
do 
    if [ -f "$file" ] 
    then 
     base=${file##*/} 
     noext=${base%.*} 
     newfile=$(printf '%s' "$noext" | openssl sha1) 
     cp "$file" "new_names/$newfile.png" 
    fi 
done 
0

嘗試

newfile=$(openssl sha1 $file)  
mv "$file" "${newfile##*= }" 
2

試試這個:

newfile=$(openssl sha1 $file | awk '{print $2}') 
mv $file $newfile 
1

我試圖做同樣的事情八九不離十,但這裏的片段沒有/完全相同/我需要什麼,再加上我是bash腳本的新手......對不起......最後我將幾個想法一起插入到腳本中,以滿足我的需求 - 查看./pics和將它們重命名爲舊的哈希值,同時保持當前的擴展名。我已經在一堆不同的圖片上測試過了,到目前爲止它的工作原理如下。我想象另一個像我這樣的新手能夠複製/粘貼這個,並且如果你的最終結果恰好與我的相同,那就很好。感謝大家的幫助!

#!/bin/bash 
for file in ./pics/* 
    do 
    newfile=$(openssl sha1 $file | awk '{print $2}') 
    ext=${file##*.} 
    mv "$file" "./pics/$newfile"."$ext" 
    done