我有一个由许多子目录组成的目录,每个子目录包含不同的文件,例如:
目录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.csv
C
我要做的是压缩特定的运行文件,例如,我想压缩 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
根据需要多次调用。作为add
的zip
默认模式,它会更新存档并将文件添加到其中。
如果需要进一步挖掘未知或变化的子目录数量,请使用bash
setglobstar
选项
shopt -s globstar
并使用:
zip run2.zip **/Run2.csv # or respectively
printf '%s\0' **/Run2.csv | xargs -0 zip run2.zip
**/Run2.csv
Run2.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 -@