我有一个表,其中存储了一些文件名。
我想在特定文件夹下找到所有具有该名称的文件并将其全部压缩。
磁盘上的结构类似于:
/文件夹/sub1/file1
/文件夹/sub1/文件2
/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>
谢谢。
最佳答案
对命令进行了一些添加:
首先,您要使用 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
的内容。 ,每个执行一个 bool 值 or
(最初使用 false
,后来使用所有其他文件名)并最终返回匹配的文件列表。
...您最终通过管道传输到 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
请记住,这假设您的文件名中没有空格。如果这样做,则会增加一点复杂性:您可以使用 -print0
来解决这个问题。和-0
在find
和xargs
分别,虽然 zip
将会遇到困难,因此您需要添加另一个中间阶段(或使用 zip -r
)。
关于mysql - linux命令行根据mysql结果集压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18814845/