嘗試將目前目錄中的所有檔案新增至檔案中,並根據新增的特定檔案名稱/副檔名命名輸出檔案。
本質上,當新增一個帶有 .exe 副檔名的檔案時,假設只有一個且至少有一個 .exe,則檔案名稱與該檔案相同。
Foo.exe -> Foo.7z
這是我到目前為止的腳本 7z a archive.7z *.* -x!*.sh
答案1
set -- *.exe
將符合的檔案名稱儲存*.exe
為位置參數,除非沒有符合項。如果沒有匹配,結果取決於 shell(請參閱開頭部分)這個答案);在 POSIX shell 中,您可以將文字*.exe
字串作為第一個也是唯一的位置參數。
如果您確定只有一場匹配,則無需測試任何內容。如果您不確定,那麼:
- 檢查是否
$#
擴展為1
([ "$#" -eq 1 ]
), - 檢查所指控的文件是否存在(
[ -e "$1"]
)。
那你要找的名字就在 裡$1
。要翻譯Foo.exe
成Foo.7z
你需要消除exe
並加7z
( ${1%exe}7z
)。
該片段將類似於:
(
set -- *.exe
# here validate $# and/or $1 if necessary
7z a "${1%exe}7z" …
)
我使用了子shell,因此set
不會影響主shell的位置參數。引用很重要。
筆記:
- 該解決方案允許匹配是一個目錄。任何目錄也是文件。
- 您編寫了“添加所有文件”,然後使用了
*.* -x!*.sh
.我不會挑剔地說排除與“所有文件”相矛盾。但也存在問題:-x!*.sh
應該被引用,所以 shell 永遠不會擴展*
。這個字串應該用單引號引起來,因為有些 shell!
即使用雙引號也會擴展。*.*
在 Windows 中可能意味著「所有檔案」(至少用一些工具),但在 Linux shell 中,點嚴格匹配點。*
由於文件名生成模式更接近“所有文件”,仍然不是“所有文件”。
- 解決方案很容易出現托克圖。也許您的目錄內容不會“隨機”更改,並且該解決方案將起作用。如果目錄不是靜態的,那麼可能需要建立一個具有臨時名稱的存檔,列出其內容並解析以了解
.exe
存檔中的內容(如果有),最後相應地重命名存檔。 - 請記住,Linux 中的檔案名稱通常區分大小寫;使用檔案名稱的工具也區分大小寫。一般情況下
set -- *.exe
不會檢測到FOO.EXE
。在某些 shell 中,您可以調整此行為(例如shopt -s nocaseglob
在 Bash 中進行調查);那麼您需要在名稱翻譯過程中${1%[eE][xX][eE]}7z
正確處理EXE
或Exe
任何其他變體。