我有一个调用 unzip 命令的 bash 脚本,它只需要提取其中文件路径包含子目录名称的文件,该子目录名称是 3 个特定单词之一:“a”、“apple”和“applescript” . 所以文件 /a/b/c.txt 和 /com/apple/foo.txt 都应该被提取。
我知道对于普通的 bash 命令行 glob,我可以使用类似*/{a,apple,applescript}/*.txt
的东西,但这在这里不适用,因为 unzip 命令是评估 glob 的东西,而不是 bash。
所以这样的命令不起作用:unzip -oj file.zip '*/{a,apple,applescript}/*.txt'
我尝试过的一件事是依次执行 3 个单独的解压缩命令,如下所示:
unzip -oj file.zip '*/a/*.txt'
unzip -oj file.zip '*/apple/*.txt'
unzip -oj file.zip '*/applescript/*.txt'
但这不起作用,除非 zip 文件肯定包含a
子目录和apple
子目录,而且我不能保证会是这种情况。
完成这项工作的最佳方法是什么?有没有办法在一个 zip 命令中使用正则表达式来做到这一点?或者,在 zip 文件中并非所有 3 个子目录名称都存在的情况下,有没有办法使 3 个顺序命令起作用?
您可以使用大括号扩展,您只需要引用星号以保护它们免受 shell 的 glob 扩展:
如果其中一个模式不匹配,这仍然会以错误退出;如果这是一个问题,您可以忽略退出状态 11(表示文件不匹配):