Bash
為 Linux 解壓縮命令編寫正則表達式以選擇要提取的文件
我有一個呼叫 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 擴展:
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