Como posso passar o conjunto de resultados de nomes de arquivos de uma consulta MySQL para zip no Linux?

0

Meu problema é bem direto, e acho que estou perto, mas preciso de um impulso na direção certa.

Eu tenho uma tabela MySQL que contém muitos nomes de arquivos que são usados por um site. Todos esses arquivos existem em um diretório images . O que eu estou tentando alcançar é ser capaz de SELECT alguns desses nomes de arquivos com base em várias condições e, em seguida, ter esses arquivos e apenas os arquivos adicionados a um arquivo .zip.

Percebi imediatamente que estava tendo problemas com nomes de arquivos que continham espaços. Então, modifiquei minha consulta SQL para que os nomes dos arquivos fossem citados. Então, o que eu acabei fazendo foi:

zip sample-images $(mysql -u username -pPassword -e "SELECT CONCAT('"', ifnull(products_image, ''), '"'), CONCAT('"', ifnull(products_image_2, ''), '"').... WHERE condition=true" db_name --silent --raw)

Isto produz uma lista de todos os nomes de arquivos que estou procurando no banco de dados (juntamente com entradas vazias para os valores nulos), no entanto, o resultado para cada linha é zip warning: name not matched: "filename.jpg" .

Alguém pode me ajudar com isso?

UPDATE Eu acredito que o problema é algo com o nome do arquivo escapar. Eu escapei das aspas duplas na consulta, de modo que os CONCATs se tornaram CONCAT('\"', ifnull(products_image, ''), '\"'),.... , mas ainda têm o mesmo resultado.

    
por nathangiesbrecht 07.01.2015 / 23:02

2 respostas

0

Algo como isso deve funcionar:

mysql -u username -pPassword -e "SELECT CONCAT('\"', products_image, '\"'), CONCAT('\"', products_image_2, '\"') WHERE condition=true AND products_image IS NOT NULL && products_image_2 IS NOT NULL" db_name --silent --raw --skip-column-names | zip myzipfile.zip -@

Embora eu não possa testá-lo agora.

    
por 07.01.2015 / 23:09
0

Eu retiraria as aspas que você adicionou ao SQL e faria algo assim:

mysql -u username -pPassword -e \
"SELECT products_image,products_image_2
WHERE condition=true
AND products_image IS NOT NULL && products_image_2 IS NOT NULL" \
db_name --silent --raw --skip-column-names |
while read FileName
do
zip sample-images "$FileName"
done

Eu dividi a linha e coloquei em \ para facilitar a leitura, mas você pode juntar-se novamente se desejar. Além disso, se você preferir, pode colocar o código do shell em uma linha:

mysql ... | while read FileName; do zip sample-images "$FileName"; done

Não é tão fácil de ler.

    
por 07.01.2015 / 23:59