我正在撰寫一個呼叫外部程式的 bash 腳本,該程式生成一個格式為 ########.zip 的 zip 檔案,其中的 '#'s# 可以是任何十進制數字。沒有辦法預測數字將是什么。
到目前為止,我已經能夠通過使用正則運算式 [0-9][0-9]*zip 來完成諸如移動 zip 檔案和解壓縮之類的事情。但是,現在我需要在目錄名稱######## 下的存檔中添加一個 txt 檔案,其中數字與存檔名稱相同。所以,如果存檔是 12345678.zip,我需要添加檔案 12345678/foo.txt。
我能看到的唯一方法是創建目錄'12345678'并將檔案復制到那里,然后將目錄添加到存檔中。但是我不知道如何獲取存檔的名稱,以便我可以創建目錄。
我能想到的最好的辦法是使用反引號將 ls -l 的輸出分配給一個變數,然后決議它以獲得檔案名部分。但是必須有更簡單的方法嗎?
如果重要的話,我使用 7z 作為 zip 實用程式。
謝謝!
uj5u.com熱心網友回復:
您要的不是正則運算式,而是“全域運算式”。特別是,如果您想匹配任意數量的數字,可以使用稱為擴展通配符或“extglobs”的 bash 功能來完成。在https://wiki.bash-hackers.org/syntax/pattern#extended_pa??ttern_language閱讀更多內容。
#!/usr/bin/env bash
# ^^^^- NOT sh
shopt -s extglob
for f in ([[:digit:]]).zip; do
digits=${f%.zip}
mkdir -p "$digits"
echo hello >"$digits/foo.txt"
zip "$f" "$digits/foo.txt"
done
在引數擴展 digits=${f%.zip}中,我們.zip將檔案名的末尾去掉,并將其余部分存盤在變數中digits。
將上述內容擴展為在臨時目錄中作業并自行清理:
#!/usr/bin/env bash
# ^^^^- NOT sh
shopt -s extglob
olddir=$PWD
for f in ([[:digit:]]).zip; do
digits=${f%.zip}
tempdir="$(mktemp -d -t zipupdate.XXXXXX)"
(
cd "$tempdir" || exit
mkdir -p "$digits" || exit
echo hello >"$digits/foo.txt" || exit
zip "$olddir/$f" "$digits/foo.txt"
)
rm -rf "$tempdir"
done
uj5u.com熱心網友回復:
由于 OP 正在使用7z,我們可以使用該rn選項來重命名存檔中的檔案并消除創建/洗掉臨時子目錄的需要......
設定:
$ 'rm' -rf zipdir
$ mkdir zipdir
$ cd zipdir
$ zipfile='12345678.zip'
$ digits="${zipfile//.zip/}"
$ declare -p digits
declare -- digits="12345678"
$ echo abc > sample.txt
$ echo def > foo.txt
${zipfile}使用sample.txtand創建/填充foo.txt:
$ 7z a "${zipfile}" sample.txt foo.txt
... snip ...
Archive size: 158 bytes (1 KiB)
Everything is Ok
$ 7z l "${zipfile}"
... snip ...
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2022-05-14 15:53:16 ..... 4 4 foo.txt
2022-05-14 15:53:16 ..... 4 4 sample.txt
------------------- ----- ------------ ------------ ------------------------
2022-05-14 15:53:16 8 8 2 files
現在將${digits}目錄作為前綴添加到foo.txt:
$ 7z -- rn "${zipfile}" foo.txt "${digits}/foo.txt"
... snip ...
Archive size: 306 bytes (1 KiB)
Everything is Ok
$ 7z l "${zipfile}"
... snip ...
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2022-05-14 15:53:16 ..... 4 4 12345678/foo.txt
2022-05-14 15:53:16 ..... 4 4 sample.txt
------------------- ----- ------------ ------------ ------------------------
2022-05-14 15:53:16 8 8 2 files
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475848.html
