如何在Linux中压缩文件列表


18

我有很多文件需要压缩到一个目录中。我不想压缩目录中的所有文件,而只压缩与特定查询匹配的文件。

我做了

grep abc file-* > out.txt 

用每个文件中所有“ abc”实例创建文件。我需要文件本身。如何告诉bash仅压缩那些文件?


通配符不起作用?为什么?如果我能问...
jherran 2014年

@jherran我不想压缩目录中的所有文件,仅压缩与特定查询匹配的文件。我确实grep abc file-* > out.txt制作了一个文件,其中每个文件都包含“ abc”的所有实例。我需要文件本身。
约翰·曼格

@jherran的意思是zip ZipFile.zip file-*,这是显而易见的方法。仅当您使用find来自不同搜索的复杂或串联的文件列表时,才需要中间文件。
AFH 2014年

Answers:


32

很简单的:

zip archive -@ < out.txt

也就是说,如果out.txt文件每行包含一个文件名。它将所有文件从添加out.txt到一个名为的档案中archive.zip

-@选项zip从STDIN读取。

如果您要跳过创建临时out.txt文件的操作,也可以使用grep的功能来打印文件名。-r启用递归搜索(在您的情况下可能不需要)并-l仅打印文件名:

grep -rl "abc" file-* | zip archive -@

效果很好,除了我有一个列表文件中文件名中有空格的地方。我试图用``来转义它们,而不是转义它们,一次用引号引起来,一次用不带引号引起来的文件名(一行-一个文件名)。到目前为止没有任何工作。
Thomas W.

2
我使它可以使用`\`转义空格,并且文件和以下内容中没有引号:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

如果您想压缩具有类似名称的文件,则可以尝试zip archive.zip $(ls common_name*)
chepe263

@ chepe263如果文件的路径中有空格,这会中断。通常不建议解析ls输出。
slhck

对于在Mac上受搜索引擎索引影响最大的其他人-@,即使手册页仍包含有关not on MacOS
Aidan Miles

0

此处开始,替代已接受答案的方法:

cat out.txt | zip -@ zipfile.zip
cat out.txt | zip -@ - > zipfile.zip
zip zipfile.zip $(cat out.txt) -r
zip zipfile.zip -r . -i@out.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.