包含點檔時出現 tar 錯誤

包含點檔時出現 tar 錯誤

我需要壓縮一些文件,其中一個是點文件。

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

變數替換避免了tar: Removing leading '/' from member names警告,並簡化了解壓過程。

但我收到這個錯誤:

tar:tmp/foo/.env tmp/foo/docker-compose.yml:無法統計:沒有這樣的檔案或目錄

硬編碼路徑有效:tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

所以我認為問題在於處理該點文件,或與轉義有關?

答案1

當外殼膨脹時"$FILES",空間就失去了其語法價值。因此該命令作為單一路徑tar接收。tmp/foo/.env tmp/foo/docker-compose.yml

就像

file='a b'
touch "$file"

將創建文件a b,而不是兩個文件ab

因此,正如評論中所建議的,您應該對不同的文件使用不同的變數:tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


直接運行有效的事實tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml是因為空格在那裡具有語法價值,將一個參數與另一個參數分開。對於「人眼」來說, "$FILES"to擴展後會產生相同的空間tmp/foo/.env tmp/foo/docker-compose.yml,但在這種情況下,由於引用,空間沒有特殊意義,因此整個值將被視為單一路徑。

相關內容