我有一个调用 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'
a
但除非 zip 文件明确包含子目录和子目录,否则这不起作用apple
,而且我不能保证情况会是这样。
完成这项工作的最佳方法是什么?有没有一种方法可以使用正则表达式仅在一个 zip 命令中执行此操作?或者,在 zip 文件中并非全部 3 个子目录名称都存在的情况下,是否有办法使 3 个连续命令起作用?
答案1
您可以使用大括号扩展,只需引用星号即可保护它们免受 shell 全局扩展的影响:
unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt"
如果其中一种模式不匹配,这仍然会退出并出现错误;如果这是一个问题,您可以忽略退出状态 11(这表明文件不匹配):
unzip -oj file.zip "*/"{a,apple,applescript}"/*.txt" || if [[ $? != 11 ]]; then
echo Something bad happened
fi