Shell-Script

如何解壓縮文件夾並將目錄更改為提取的文件夾

  • August 12, 2022

我正在嘗試製作一個腳本,我可以在其中解壓縮文件,然後 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}將返回$variablewith patternremoved 的值。如果文件名是.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
}

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