【问题标题】:bash - Unzip specific type of files from multiple zipbash - 从多个 zip 中解压缩特定类型的文件
【发布时间】:2014-04-30 14:01:35
【问题描述】:

我有 5 个 zip 文件,每个文件里面都有几个 .txt 文件和一些其他文件。我只想解压缩扩展名为.txt 的文件,但在循环的第一次迭代中unzip 正确运行,“*.txt”被视为常量字符串,并且在所有后续迭代中unzip 尝试解压缩文件完全相同的文件名(即之前 zip 文件中的那些文件)。

for file in *.zip
do
    unzip ${file} *.txt
done

例如,在第一个循环中,它采用 1.zip 并解压缩,例如file1.txt 然后它进入第二个循环,它需要2.zip 并尝试再次提取file1.txt - 而不是从2.zip 中选择所有.txt 文件。

【问题讨论】:

  • 你给出的例子有什么问题?
  • 在第一个循环中,它需要 1.zip 并解压缩,例如file1.txt 然后进入第二个循环,它需要 2.zip 并尝试解压缩 file1.txt - 而不是从 2.zip 获取 .txt 文件。
  • 你是说第二个和后续的zip文件中的txt文件与第一个同名,并且覆盖它们?
  • 不,在每个 zip 中,.txt 文件的名称都不同。在 1.zip 中我有 file1.txt,在 2.zip file2.txt 中,但是当它在第二个循环中时,它不会更新这个“*.txt”名称并且只解压缩 file1.txt(它不存在于这个拉链)。

标签: bash unzip


【解决方案1】:

你需要用单引号保护你的通配符模式,否则shell会扩展它(这称为globbing):

for file in *.zip; do
    unzip ${file} '*.txt'
done

在循环的第一次迭代期间,*.txt 不会扩展为任何内容,因为工作目录中没有 txt 文件,因此该命令按预期工作。在第一次迭代之后,它会扩展为您刚刚从第一个 zip 文件中提取的所有 txt 文件,因此第二次和后续迭代在 globbing 之后实际上看起来像这样:

unzip ${file} file1.txt

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多