根據 zip 名稱模式將 zip 檔案提取到目錄中

根據 zip 名稱模式將 zip 檔案提取到目錄中

我有這些 zip 檔案:

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

我需要使用這種格式將每個 zip 提取到適當的目錄中(基本上,我只需要前 30 個字元):

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

這是我目前擁有的命令,該命令有效,但僅適用於第二個 zip 檔案 (PLP_634562_2004-03-02_02-15-07_UBIC.zip)

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

我想更改它,以便它只讀取 zip 檔案的前 30 個字符,然後基於該字符創建目錄。它將確保任何新的 zip 檔案命名格式將來都可以使用。

我嘗試將命令的 n 變數部分更改為此

n=$(echo ${f:0:30}); 

但這沒有用。我正在使用 Linux bash。

答案1

sed可以獲得前 30 個字元:

sed 's|\(.\{30\}\).*|\1|'

並使用它而不是cutfor循環中。

該替換的細分是您替換為sed之間的匹配內容。 (以 轉義)計數 30 個單一字元 ( )。\( \)\1{30}\.

答案2

感謝您的所有建議,我吸收了大家的建議並建立了這個命令。就我而言,這正是我需要的命令。

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • 它循環遍歷所有 zip 文件
  • 回顯每個 zip 檔案(僅檔案名,不顯示大小或路徑等額外資訊),然後僅顯示前 30 個字元並將其儲存在 n 變數中
  • 然後,它將每個 zip 檔案的內容提取到一個新目錄(使用 n 變數)。

就我而言,我將其放入從另一個目錄運行的腳本中。

相關內容