如何压缩位于子目录中的特定文件

如何压缩位于子目录中的特定文件

我有一个由许多子目录组成的目录,每个子目录包含不同的文件,例如:

目录All包含子目录A, B, C, and D。每个子目录包含如下文件:

A (Run1.csv, Run4.csv)
B (Run2.csv, Run3.csv)
C (Run1.csv, Run3.csv)
D (Run2.csv, Run4.csv)

如您所见,每个文件在不同的子目录中都有不同的重复项。例如,Run1.csv文件夹中 的数据与文件夹中 的A数据不同。Run1.csvC

我要做的是压缩特定的运行文件,例如,我想压缩 run2 的所有文件。我使用了以下命令:

zip run2.zip All Run2.csv 

zip run2.zip Run2.csv 

但它们都不起作用。

我该如何修复它?

答案1

您可以bash按如下方式使用路径名扩展:

zip run2.zip */Run2.csv

*/Run2.csv匹配Run2.csv任何子目录中调用的每个文件。如果你有非常很多文件与 glob 匹配,由于 shell 的ARG_MAX限制,此操作会失败。要解决此问题,请使用:

printf '%s\0' */Run2.csv | xargs -0 zip run2.zip

它使用内置命令printf构建匹配文件的零分隔列表,并将其通过管道传输到xargs,后者会zip根据需要多次调用。作为addzip默认模式,它会更新存档并将文件添加到其中。

如果需要进一步挖掘未知或变化的子目录数量,请使用bashsetglobstar选项

shopt -s globstar

并使用:

zip run2.zip **/Run2.csv  # or respectively
printf '%s\0' **/Run2.csv | xargs -0 zip run2.zip

**/Run2.csvRun2.csv匹配任意子目录中递归调用的每个文件。

进一步阅读

答案2

您可以使用类似的方法来搜索和存档所有(例如)Run2.csv文件:

zip run2.zip `find . -name Run2.csv`

根据建议,如果 OP 期望文件/目录名称中包含特殊字符(例如空格),则可以使用如下命令:

find . -name Run2.csv -exec zip run2.zip {} +

答案3

尝试以下方法来查找文件并将它们压缩到单独的文件中:

find . -name Run2.csv -print | zip Run2.zip -@

相关内容