2

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

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

在磁盘上的结构与此类似:

/文件夹/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>

谢谢。

4

1 回答 1

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最初是,后来是所有其他文件名)并最终返回匹配。

...您最终zip使用另一个 xargs 管道传输到:

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

请记住,这假设您的文件名中没有空格。如果这样做,那会增加一些复杂性:您可以分别使用-print0and -0infind和来解决这个问题xargs,尽管zip这样做会更困难,因此您需要添加另一个中间阶段(或使用zip -r)。

于 2013-09-15T17:15:07.913 回答