如何解壓縮文件夾並將目錄更改為提取的文件夾
我正在嘗試製作一個腳本,我可以在其中解壓縮文件,然後 cd 進入該解壓縮文件(即解壓縮 test.zip,然後 cd 進入測試文件夾)。問題是 zip 文件的名稱各不相同,我正在嘗試編寫一個無論名稱如何都可以工作的腳本。
目前,我有:
for file in $(ls *.zip); do unzip ${file} cd ${file}; done
但我收到一個錯誤,因為 ${file} 仍然是一個 .zip 文件(如果我正確理解了錯誤)。
有什麼建議麼?
謝謝。
編輯:為了澄清,我正在嘗試對 .zip 文件中的文件進行分析。所以我認為我的目標是首先解壓縮文件(然後將創建一個與沒有 .zip 的 zip 文件同名的目錄),然後 cd 進入該目錄。一旦進入該目錄,我就會有另一行程式碼開始分析文件。
假設 i) zip 文件創建了一個新目錄,並且 ii) 該目錄的名稱與沒有
.zip
副檔名的 zip 文件的名稱相同(請注意,這兩個假設通常都是錯誤的),那麼您可以這樣做:for file in *.zip do unzip -- "$file" cd -- "${file%%zip}" done
,
${file%%zip}
或更一般的語法${variable%%pattern}
將返回$variable
withpattern
removed 的值。如果文件名是.so${file%%zip}
將返回。foo``foo.zip
那裡表示選項的
--
結束,如果您可以使用以 . 開頭的文件名,這將很有用-
。還要注意根本不需要使用ls
,這是一件非常好的事情,因為解析的輸出ls
非常脆弱,從不推薦。您可以通過確保目錄首先存在來使它更複雜一點:
for file in *.zip do unzip -- "$file" [ -d "${file%%zip}" ] && cd -- "${file%%zip}" done
請注意,這僅在您現在想要在目錄中執行的腳本中執行操作時才有用。否則,如果您希望執行此命令並將目前的 shell 會話現在位於目標目錄中,則不會發生這種情況,因為
cd
它不會影響執行腳本的 shell,而不是您從中啟動腳本的 shell。因此,如果您希望這是一種提取文件、移動到新目錄然後在互動式 shell 會話中執行操作的方法,則需要將其設為函式而不是腳本:
unzipcd(){ for file in *.zip do unzip -- "$file" [ -d "${file%%zip}" ] && cd -- "${file%%zip}" done }