Soy muy nuevo en Linux / línea de comando y necesito cifrar los nombres de los archivos 10K + (nombres únicos) para que coincidan con el nombre cifrado MD5 en la base de datos mySQL.
He visto cómo puede cambiar el nombre de un directorio de archivos y cómo obtener el hash de un archivo ( ¿mdsum? ), Pero estoy atascado en cómo obtener el hash del nombre del archivo y luego cambiar el nombre del archivo al hash generado que retiene la extensión es decir
mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg
Parece que debería ser un simple cambio de nombre o mv
línea, pero no puedo entenderlo.
Muchas gracias por sus ideas.
PD: He visto el uso de las funciones de Perl en algunos ejemplos cercanos a lo que estoy buscando, pero no tengo idea de dónde / cómo usarlos.
command-line
rename
mv
BradH
fuente
fuente
fba8255e8e9ce687522455f3e1561e53
Paramynicepicture
qué sirve el hash MD5 , ¿eso significa que la extensión debe eliminarse antes del hash?md5sum <<<"file name"
elfile name
archivo existe o no, porque lo considera como una cadena, excepto alimentarlo con el nombre de los archivos existentes.Respuestas:
No dijiste qué shell quieres usar, así que solo estoy asumiendo que Bash : la respuesta necesita ajustes para funcionar con otros shells.
Versión de script:
Este
for
bucle simple toma cada archivo en el directorio actual, calcula la suma md5 de su nombre y lo genera. Use esto para verificar la funcionalidad, si desea comenzar a cambiar el nombre, reemplace el segundoecho
pormv
.Explicaciones
echo -n "$i" | md5sum
- calcule la suma md5 del nombre completo del archivo, incluida la extensión del archivo ( Piping ), para despojar el cambio de extensiónecho -n "$i"
a uno de los siguientes:sum=$(…)
- ejecutar…
y guardar la salida en$sum
( Sustitución de comandos )${sum%% *}
- muestra todo hasta el primer espacio ( sustitución de parámetros ), igual que uno de los siguientes:${i##*.}
- muestra todo después del último punto (sustitución de parámetro), igual que uno de los siguientes:Si necesita cambiar el nombre de los archivos de forma recursiva en diferentes carpetas, use
find
con la-exec
opción.fuente
Este
bash
script usa lamd5sum
utilidad de GNU coreutils para calcular el hash MD5 a partir del nombre base (sin extensión) de cualquier nombre de ruta. La función auxiliarmd5name
realiza el cálculo real y generará el nuevo nombre con la ruta completa y la extensión.La
md5name
función utilizaawk
para ensamblar el nuevo nombre de las partes del nombre de ruta dado y el resultado demd5sum
.Ejemplos de la función en uso por sí misma:
... donde
c9e89fa443d16da4b96ea858881320c9
está el hash MD5 de la cadenafile name here
.Elimine
echo
el archivo del script en la parte superior para cambiar el nombre de los archivos. Es posible que desee guardar la salida del script original en el archivo (con elecho
lugar) si en algún momento necesita restaurar los nombres de los archivos a sus originales.Tenga en cuenta que ejecutar esto dos veces en un conjunto de archivos calculará el hash MD5 de los hashes MD5, y que el nombre de archivo original se volverá irrecuperable a menos que tome notas cuidadosas sobre qué archivos se llaman después de cada ejecución del script.
fuente
awk
porción podría reemplazarse conwhile read sum dummy ; do printf "%s/%s.%s\n' $dir $sum $ext ; done ;
Necesitasdummy
capturar el '-'.awk
a mí mismo y me ha llevado un tiempo de uso debash
los servicios públicos en lugar desystem()
enawk
Con
perl
'srename
:(eliminar
-n
cuando sea feliz).fuente
Para un
AWK
enfoque:Los
find
comandos modernos no requieren un directorio para la entrada.
, por lo que el [Directorio] podría dejarse en blanco. El-type f
único encuentra archivos, lo cual es útil yamd5sum
que no le gustan los directorios y cambiar el nombre del directorio mientras se ejecuta no sería una buena idea. Úselo-iname pattern
si solo desea usar algunos archivos, por ejemplo-iname \*.dat
, si el caso es importante, úselo en-name
lugar de-iname
.Las
match(...); sub(...)
piezas extraen porciones del nombre del archivo y las reemplazan en la cadena de entrada. Tenga en cuenta que"^"
y"$"
están [pre / ap] pendientes para evitar reemplazar una cadena que puede repetir la ruta / extensión.Reemplace
print(com)
consystem(com)
para realizar el cambio de nombre.Si desea utilizar el
md5sum
archivo real como nombre, puede utilizar el hecho de quemd5sum
genera la suma y el nombre de archivo de entrada para hacer algo como:El
while read sum file
tomará 2 argumentos, los resultados delmd5sum
comando, y asignarsum
yfile
las variables con ellos. Comosum
no debería tener espacios,read
debería funcionar bien.Obviamente, se
[echo]
debe eliminar cuando se está ejecutando, pero siempre es una buena idea probar cualquier cambio programado para probar la búsqueda antes de ejecutar.Todo esto supone que estás corriendo
bash
. Además, esto se puede escribir como una línea larga:fuente
Este enfoque a menudo me gusta usar.
El comando "ls" produce una secuencia de líneas de texto. El comando "sed" transforma cada línea con reglas de coincidencia de patrones. El comando "sed" genera un comando "mv" que luego se canaliza a través de un shell "sh" para su ejecución. Los parámetros del comando "mv" son como "mv oldfilename newfilename", que cambia el nombre del archivo. Construyo el nuevo nombre de archivo con un comando sed que toma la parte anterior al último punto, y lo hace eco en la entrada del comando "md5sum", y luego toma solo el hash de su salida.
Recorriendo mi proceso, primero enumere los archivos ('head -n 3' para ver las primeras 3 líneas):
Luego piense en la transformación con sed (aún no canaliza ningún comando generado a través de un shell)
Hay tres patrones de coincidencia:
Quiero usar sed para reemplazar un nombre de archivo de entrada con "mv filename NEWfilename", pero como estoy canalizando comandos a través de un shell, puedo generar comandos que obtienen el md5sum, como este
para obtener solo el hash
En un shell de Unix, podemos usar operadores de backtick (`some_command`) para ejecutar un subcomando, por ejemplo
Volviendo al comando mv, quiero que sed produzca "mv here there" con "there" reemplazado por un comando backtick para obtener el md5sum. La cadena dentro de la cadena de reemplazo de sed comienza así
Pero claramente está haciendo el mismo hash para cada nombre de archivo, ya que el comando backticked-command se ejecuta antes de que sed vea la cadena. Para detener el shell que ejecuta el comando backtick para que sed genere los backticks, tenemos que anteponer barras diagonales (también al carácter de tubería), así que nuevamente:
La salida también necesita nombres de archivo para ser citados en caso de espacios, por lo que
Así que vamos a probar este, pasándolo a través de un shell:
Funcionó ? supongo:
Aquí hay un enfoque para la verificación cruzada; use la opción "ls" "-i" para generar el sistema de archivos unix i-node (que no cambia con "mv"):
O, usando el comando "pegar" (paquete 'coreutils')
fuente
Me gusta esa respuesta de una línea, pero se rompe porque analiza el nombre del archivo. También lo subí un poco con sha hashes.
Creo que también extrae los archivos y los coloca en la base de donde se ingresó el comando.
Gracias.
fuente