7zip 以特定檔案名稱命名存檔

7zip 以特定檔案名稱命名存檔

嘗試將目前目錄中的所有檔案新增至檔案中,並根據新增的特定檔案名稱/副檔名命名輸出檔案。

本質上,當新增一個帶有 .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.exeFoo.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正確處理EXEExe任何其他變體。

相關內容