我有一个表,其中存储了一些文件名。
我想在特定文件夹下找到所有具有该名称的文件并将其全部压缩。
在磁盘上结构类似于:
/文件夹/ 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>
感谢。
答案 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
这样的东西,每个都执行一个布尔or
(false
最初,稍后与所有其他文件名一起)并最终返回匹配的文件列表。
...你最终使用另一个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
find
和xargs
来解决这个问题,尽管{{1}将会有更难的时间,所以你需要添加另一个中间阶段(或使用zip
)。