LinuxでMySQLクエリの結果セットのファイル名をzipに渡す方法


0

私の問題はかなりまっすぐ進むものです、そして私は近いと思いますが正しい方向への後押しが必要です。

私はウェブサイトで使用されている多くのファイル名を含む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)

これは私がデータベースで探しているすべてのファイル名のリストを(null値の空のエントリと共に)出力しますが、すべての行の結果は次のようになります。 zip warning: name not matched: "filename.jpg"

誰かがこれを手伝ってくれる?

更新 私は問題がファイル名のエスケープと何かであると信じています。 CONCATが次のようになるように、クエリ内の二重引用符をエスケープしました。 CONCAT('\"', ifnull(products_image, ''), '\"'),.... それでも同じ結果が得られます。

回答:


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

今はテストできませんが。


同じことが言えますが、出力は1行に1行ずつ返されます。私はあなたが私が使用していたサブシェル方法よりもあなたがより提案するパイプスタイルを好むけれども。
nathangiesbrecht

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

読むのはそれほど簡単ではありません。


私はそれらの中にスペースを含むファイル名の引用符が必要になるでしょう、いいえ?
nathangiesbrecht

はい、あなたは引用符が必要になるでしょう。 zip images "$FileName"
Philip Kearns
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.