![从多个 zip 文件中解压缩特定文件](https://linux22.com/image/63747/%E4%BB%8E%E5%A4%9A%E4%B8%AA%20zip%20%E6%96%87%E4%BB%B6%E4%B8%AD%E8%A7%A3%E5%8E%8B%E7%BC%A9%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6.png)
我是 Unix 新手,正在尝试从多个 zip 文件中提取特定模式文件名。我用来find
查找 zip 文件,然后尝试提取 zip 文件中文件名为 CTL 的文件a*b*zip
。
$ unzip -jn 'find $source_dir -mtime -$st_d -daystart -iname "a*zip"' \
*CTL* -d $target_dir`
除此之外我尝试使用:
$ find -type f -newermt $start_date \! -newermt $end_date -name "a*zip" \
| while read filename; do unzip -d $target_dir; done;`
但这是提取所有文件,但我只查找那些具有文件名的文件CTL。
答案1
您可以简单地find -exec
单独使用来做到这一点。
find . -type f -name '*.zip' -exec unzip {} '*CTL*' -d "$target_dir" \;
解释: -exec
{}
将在找到替换文件名的每个文件上执行以下命令。该命令必须由 终止;
。\;
在末尾使用(';' 转义\
) 以避免 shell 将;
for 自身解释为 for 的终止,而是将其作为常规文本find
传递。find
另外,请注意,当文件模式作为参数传递时,最好将文件模式括在引号中,即'*CTL*'
与仅*CTL*
.这样做时,您可以避免让 shell 扩展文件名。例如,假设在这种情况下,您的一个 zip 文件的文件名中包含 CTL(例如abcCTL.zip
)。如果您仅使用*CTL*
模式,shell 将扩展它,而不是将模式传递给unzip
,而是传递文件名abcCTL.zip
,这显然不是您想要的。