Bash

Unzip 拒絕通過 xargs 接受輸入

  • April 6, 2021

我目前正在努力解決以下問題:

在 macOS 中使用 bash shell 我想在我的下載目錄中搜尋名稱中包含固定和可變部分的 zip 文件,固定部分為“satori-export”,然後解壓縮該文件。作為一個完全 *nix 新手,我想出使用 CLI 來實現這一點(對於由於醜陋、低效或其他糟糕的命令行使用而導致的任何流血的眼睛,請事先道歉):

ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs unzip

或者

ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs -I "archive" unzip "archive"

但是,執行這些命令中的任何一個都會使我得到以下輸出:

unzip: cannot find or open ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip, ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.zip or ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.ZIP.

奇怪的是,當我直接使用文件本身作為直接輸入執行解壓縮命令時(如您所見,它使用與上面解壓縮失敗消息中首先引用的文件名完全相同的路徑和名稱),使用

unzip ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip

導致解壓縮繼續解壓縮文件而沒有投訴或問題。所以我有點迷茫,為什麼我的管道命令鏈中會拋出解壓縮錯誤?

問題是它xargs沒有擴展~;當您從命令行執行命令時,shell 會執行此操作,但這對您的管道沒有幫助。因此,unzip查找一個名為完全的文件~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip,或錯誤消息中顯示的變體之一,並且由於目前目錄中沒有命名~的目錄,更不用說包含的目錄Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip,它失敗了。

這應該有效:

find ~/Downloads -maxdepth 1 -name "*satori-export*" -exec unzip {} \;

這將查找~/Downloads名稱中包含的所有文件satori-export,並一次執行unzip一個(這在這裡很重要,因為unzip僅將其參數中的第一個文件名作為要處理的存檔的名稱;其餘的被解釋為文件名在檔案中尋找)。

引用自:https://unix.stackexchange.com/questions/643722