我的问题很简单,我想我已经接近解决了,但需要在正确的方向上取得进步。
我有一个 MySQL 表,其中包含网站使用的大量文件名。这些文件都存在于目录中images
。我想要实现的是能够SELECT
根据各种条件获取其中一些文件名,然后将这些文件(并且仅将这些文件添加到 .zip 文件中)添加到 .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, ''), '\"'),....
但结果仍然相同。
答案1
类似这样的事情应该可以工作:
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 -@
尽管我现在无法测试它。
答案2
我会取出您添加到 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
我已将行拆分并放入,\
以便于阅读,但您可以根据需要将其重新合并。此外,如果您愿意,可以将 shell 代码放在一行中:
mysql ... | while read FileName; do zip sample-images "$FileName"; done
它只是不那么容易阅读。