linux命令行基于mysql结果集压缩文件

时间:2013-09-15 16:41:56

标签: mysql linux zipfile

我有一个表,其中存储了一些文件名。

我想在特定文件夹下找到所有具有该名称的文件并将其全部压缩。

在磁盘上结构类似于:

/文件夹/ SUB1 / file1的

/文件夹/ SUB1 / file2的

/ folder / sub2 / file1< - 与sub1

下的名称相同

/文件夹/ SUB2 / file2的

所以我正在寻找类似的东西:

mysql -e "select file from table" | find /folder -type f -name <the value of file from mysql result set> | zip <all files found by all find commands>

感谢。

1 个答案:

答案 0 :(得分:2)

您的命令添加了几个:

首先,您希望在批处理模式下使用mysql,所以您可以这样做:

mysql -Be "select file from table"

它为您提供了一个没有边框的列表,因此您可以通过从第二行开始将其汇总到tail来删除标题:

tail -n +2

然后你把它传递给xargs,但在你做之前,用concat破解它(你会在一秒钟内看到原因):

mysql -Be "select concat(' -o -name ', file) from table"

现在你把它传递给xargs

xargs find /folder -false 

这是一个“假”测试(即无操作),但它会附加一堆像-o -name somename.file这样的东西,每个都执行一个布尔orfalse最初,稍后与所有其他文件名一起)并最终返回匹配的文件列表。

...你最终使用另一个xargs传递给zip

xargs zip files.zip

同样,这会将文件名作为参数放到zip

这是总行:

mysql -Be "select concat(' -o -name ', file) from table" | tail -n +2 | xargs find /folder -false | xargs zip files.zip

请记住,这假设您的文件名中没有空格。如果这样做,那会增加一些复杂性:您可以分别使用-print0-0 findxargs来解决这个问题,尽管{{1}将会有更难的时间,所以你需要添加另一个中间阶段(或使用zip)。