我有這些 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|'
並使用它而不是cut
在for
循環中。
該替換的細分是您替換為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 變數)。
就我而言,我將其放入從另一個目錄運行的腳本中。