Моя проблема довольно прямолинейна, и я думаю, что я близко, но нуждаюсь в поддержке в правильном направлении.

У меня есть таблица MySQL, которая содержит много имен файлов, которые используются веб-сайтом. Все эти файлы существуют в каталоге images . Я пытаюсь добиться того, чтобы иметь возможность SELECT некоторые из этих имен файлов на основе различных условий, а затем иметь эти файлы, и только эти файлы добавляются в ZIP-файл.

Я сразу понял, что у меня проблемы с именами файлов, в которых есть пробелы. Поэтому я изменил свой SQL-запрос так, чтобы имена файлов были в кавычках. Итак, что я закончил, было:

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)

Это выводит список всех имен файлов, которые я ищу в базе данных (вместе с пустыми "" записями для нулевых значений), однако результатом для каждой строки является zip warning: name not matched: "filename.jpg" .

Кто-нибудь может мне помочь с этим?

ОБНОВЛЕНИЕ Я полагаю, что проблема - что-то с экранированием имени файла. Я избежал двойных кавычек в запросе, так что CONCAT стали CONCAT('\"', ifnull(products_image, ''), '\"'),.... но все еще имеют тот же результат.

2 ответа2

0

Примерно так должно работать:

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 -@

Хотя я не могу проверить это прямо сейчас.

0

Я бы взял цитаты, которые вы добавили в SQL, и сделал бы что-то вроде этого:

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

Я разделил строку и вставил \ чтобы было легче читать, но вы можете присоединиться к ней вместе, если хотите. Также, если вы предпочитаете, вы можете поместить код оболочки в одну строку:

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

Это просто не так легко читать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .