Código:
La cuestión es que son un buen puñado de archivos, así que quiero construir esa sentencia SQL de manera automatizada, a través de la consola de comandos. Lo planteo de la siguiente manera:INSERT INTO `fotos` (`referencia`, `nombre`, `descripcion`, `tamanio`) VALUES (NULL, 'nombre', 'nombre', 'tamaño');
1.- Mediante LS saco toda la información que necesito: el nombre y el tamaño.
Código:
2.- Mediante una tubería, paso el resultado al siguiente comando:ls *.jpg -l -h
Código:
3.- Mediante AWK extraigo del comando anterior la información que me interesa, desechando todo lo demás.|
Código:
4.- Mediante una tubería, paso el resultado al siguiente comando:awk '{ print $8 , $5 }'
Código:
5.- Mediante SED, cojo el resultado anterior, le quito la extensión JPG al nombre del archivo, y meto el nombre en \1 y el tamaño en \2:|
Código:
Luego el resultado lo vuelco a un archivo SQL que importaré mediante PHPMyAdmin.sed -r 's/^(.*)\.jpg (.*)$/INSERT INTO \`fotos\` \(\`referencia\`\, \`nombre\`\, \`descripcion\`\, \`tamanio\`\) VALUES \(NULL\, \'\1\'\, \'\1\'\, \'\2\'\)\;/g'
La teoría está bien. Pero ahora la práctica. Las comillas simples que envuelven a \1 y a \2 me dan problemas. Si las escapo mediante una barra, de la siguiente manera:
Código:
No sé qué efecto raro produce, que da la sensación de que no encuentra el final de la expresión regular al llegar a /g', y me da un error al encontrarse con la siguiente línea del script:\'\1\'
Código:
Ese caracter que dice que está mal es el número 985 de la línea siguiente a la que contiene el comando SED../generar_indices.sh: line 9: syntax error near unexpected token `<'
Sin embargo, si no "escapo" las comillas simples:
Código:
El script se ejecuta correctamente, hace todo lo que se espera de él... salvo por el hecho de que me genera la siguiente sentencia SQL:'\1'
Código:
Donde aparece el valor "1" debería aparecer el nombre del archivo, y donde aparece el valor "2" debería aparecer el tamaño en MB.INSERT INTO `fotos` (`referencia`, `nombre`, `descripcion`, `tamanio`) VALUES (NULL, 1, 1, 2);
En resumen, si "escapo" las comillas, la ejecución del comando falla. Si no las escapo, el comando funciona pero no me "traduce" \1 y \2. ¿Alguien sabe qué estoy haciendo mal? ¿Debería "escapar" las comillas de algún otro modo?