Скрипт для переименования файлов с использованием хэша sha1 () их имени - PullRequest
8 голосов
/ 18 февраля 2011

Я создаю веб-сайт, и я хотел бы хэшировать имена файлов моих изображений.

Как я могу создать файл сценария 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

Это переименовывает файлы, но я не уверен, что использовалось для хэширования имени файла. Хэширование расширения было? Путь?

INFO

Затем я буду использовать функцию sha1 () в PHP для отображения изображений:

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

Ответы [ 4 ]

7 голосов
/ 18 февраля 2011

Примеры кода в ответах и ​​хэш редактирования содержимого файла.Если вы хотите создать имена файлов, которые являются хэшами предыдущего имени файла, не включая путь или расширение, то сделайте следующее:

#!/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
2 голосов
/ 18 февраля 2011

Попробуйте это:

newfile=$(openssl sha1 $file | awk '{print $2}')
mv $file $newfile
1 голос
/ 24 августа 2011

Я пытался сделать то же самое, но фрагменты здесь не были / точно / то, что мне было нужно, плюс я новичок в написании сценариев bash ... извините ... В конце концов, я соединил несколько идей в сценарий, который делает то, что мне нужно, - посмотрите на файлы в ./pics и переименуйте их в их старый хэш, сохраняя текущее расширение. Я проверил это на множестве разных картинок, и пока все работает как задумано. Я предполагаю, что другой новичок, такой как я, мог бы скопировать / вставить это и будет хорошо, если ваш конечный результат будет таким же, как мой. Спасибо всем за помощь!

#!/bin/bash
for file in ./pics/*
  do
    newfile=$(openssl sha1 $file | awk '{print $2}')
    ext=${file##*.}
    mv "$file" "./pics/$newfile"."$ext"
  done
0 голосов
/ 18 февраля 2011

попробуй

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