為什麼 zip 中的 -x 排除選項似乎沒有實際排除路徑?

為什麼 zip 中的 -x 排除選項似乎沒有實際排除路徑?

在 Raspberry Pi 上使用 Raspbian,我想備份 /etc 文件,但不是全部。我想排除 /etc/alternatives,所以我使用了以下命令:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/*

為什麼這不起作用?它繼續包含 /etc/alternatives 的內容,就像 /etc 中的所有其他資料夾一樣。

我嘗試了這些變體,但它們也不起作用

sudo zip -r –x /etc/alternatives/* @ /home/pi/backup/$timestamp/etcfilesall.zip /etc/*
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives'
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives/*'

在遞歸的 -r 選項下,zip -h2 幫助顯示“使用 -i 和 -x 來包含或排除路徑”,所以看起來我正在嘗試做的事情應該受到支援。

答案1

問題是“x”之前的“-”(對於選項“-x”)實際上並不是OP問題中的ASCII減號。相反,它是 Unicode u+2013(看起來相同,但行為不同)。

如果命令按預期輸入,則它會按 OP 的最後一個範例的預期工作(此處已更正):

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* -x '/etc/alternatives/*'

這可能是由於從某些網站剪下/貼上而導致的問題。

延伸閱讀:

答案2

來自man zip頁面:

zip -r foo foo -x \*.o

這將包括 foo.zip 中 foo 的內容,同時排除所有以 .o 結尾的檔案。反斜線避免了 shell 檔案名稱替換,因此 zip 在所有目錄層級執行名稱匹配。

您必須確保您的 glob*不是由 shell 擴展,而是由zip實用程式本身擴展,否則它只會影響直接位於 /etc/alternatives 目錄中的文件,而不會針對子目錄。這可以透過在前面添加反斜線*或引用它來完成:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/\*

然而,似乎你已經嘗試過類似的方法 - 我不清楚為什麼它不適合你,而它應該。儘管如此,還有其他方法可以實現類似的效果,例如在呼叫實用程式之前使用其他工具來排除不必要的檔案zip

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip $(sudo find /etc | grep -v ^/etc/alternatives)

相關內容