2011-02-18 15 views
7

Estoy construyendo un sitio web y me gustaría hacer un hash de los nombres de archivo de mis imágenes.Secuencia de comandos para cambiar el nombre de los archivos usando un hash sha1() de su nombre de archivo

¿Cómo puedo crear un archivo de script bash que cambia el nombre de cada archivo en un directorio con el SHA1 del antiguo nombre de archivo?

He intentado:

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

Pero eso no funciona :(

EDITAR

Sobre la base de las sugerencias aquí yo probamos este:

#!/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 

Esto renombra los archivos, pero no estoy seguro de qué es es utilizado para hash el nombre del archivo. ¿La extensión se convirtió en hash? hizo el camino?

INFO

entonces voy a utilizar SHA1 de PHP() para mostrar las imágenes:

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

Define 'does not work'. – GolezTrol

+0

¿Los nombres de archivo contienen caracteres espaciales? –

+1

'no se cambia nada de nombre' y 'no' – Manu

Respuesta

6

Los ejemplos de código en las respuestas hasta el momento y en su hash de edición contenidos del archivo. Si desea crear nombres de archivo que son valores hash del nombre de archivo anterior, sin incluir la ruta o extensión, a continuación, hacer esto:

#!/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

Muy bien, puedo ver por qué tiene 28.7k puntos :) – Manu

+0

eso es raro .. parece que la función sha1() de php no devuelve los mismos hash .. – Manu

+1

@Manu: ¡Vaya! ¡Lo siento! Eso debería ser 'printf '% s'" $ noext "'. –

0

tratar

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

Prueba esto:

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

yo estaba tratando de hacer lo mismo sorta pero los fragmentos aquí no eran/exactamente/Lo que necesitaba, además de que soy nuevo en bash scripting ... lo siento ... Al final uní varias ideas al script que hace lo que necesito, es decir, mira los archivos en ./pics y cambiarles el nombre a su antiguo hash manteniendo la extensión actual. Lo probé en varias imágenes diferentes y hasta ahora funciona según lo previsto. Me imagino que otro novato como yo podría copiarlo/pegarlo y ser bueno si tu resultado final es el mismo que el mío. ¡Gracias a todos por la ayuda!

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

lo siento, pero este script parece para eliminar archivos con múltiples espacios/puntos en sus nombres. ¡muchas gracias! –

Cuestiones relacionadas