如何将 MySQL 查询的文件名结果集传递给 Linux 中的 zip

如何将 MySQL 查询的文件名结果集传递给 Linux 中的 zip

我的问题很简单,我想我已经接近解决了,但需要在正确的方向上取得进步。

我有一个 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

它只是不那么容易阅读。

相关内容