Warum scheint die Option -x exclude in zip den Pfad nicht wirklich auszuschließen?

Warum scheint die Option -x exclude in zip den Pfad nicht wirklich auszuschließen?

Ich verwende Raspbian auf einem Raspberry Pi und möchte die /etc-Dateien sichern, aber nicht alle. Ich möchte /etc/alternatives ausschließen, also habe ich diesen Befehl verwendet:

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

Warum funktioniert das nicht? Es schließt den Inhalt von /etc/alternatives genauso ein wie alle anderen Ordner in /etc.

Ich habe diese Variationen ausprobiert und sie haben auch nicht funktioniert

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/*'

Unter der Option -r für die Rekursion heißt es in der Hilfe zu zip -h2: „Verwenden Sie -i und -x, um Pfade ein- oder auszuschließen“, daher scheint das, was ich versuche, unterstützt zu werden.

Antwort1

Das Problem ist, dass das "-" vor dem "x" (für die Option "-x") in der Frage des OP kein echtes ASCII-Minuszeichen ist. Stattdessen ist es der Unicode u+2013 (sieht gleich aus, verhält sich aber anders).

Wenn der Befehl wie erwartet eingegeben wird, funktioniert er für das letzte Beispiel des OP wie erwartet (hier korrigiert):

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

Dies war wahrscheinlich ein Problem, das durch Ausschneiden und Einfügen von einer Website verursacht wurde.

Weiterführende Literatur:

Antwort2

Von man zipSeite:

zip -r foo foo -x \*.o

Dadurch wird der Inhalt von foo in foo.zip eingeschlossen, während alle Dateien mit der Endung .o ausgeschlossen werden. Der Backslash vermeidet die Shell-Dateinamensersetzung, sodass die Namensübereinstimmung von zip auf allen Verzeichnisebenen durchgeführt wird.

Sie müssen sicherstellen, dass Ihr Glob *nicht von der Shell, sondern vom Dienstprogramm selbst erweitert wird zip. Andernfalls wirkt es sich nur auf Dateien direkt im Verzeichnis /etc/alternatives aus und zielt nicht auf Unterverzeichnisse ab. Dies können Sie erreichen, indem Sie davor einen Backslash einfügen *oder ihn in Anführungszeichen setzen:

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

Es scheint jedoch, dass Sie bereits eine ähnliche Methode ausprobiert haben. Mir ist nicht klar, warum es bei Ihnen nicht funktioniert hat, obwohl es hätte funktionieren sollen. Es gibt jedoch auch andere Möglichkeiten, um einen ähnlichen Effekt zu erzielen, z. B. durch die Verwendung zusätzlicher Tools, um unerwünschte Dateien auszuschließen, bevor Sie zipdas Dienstprogramm aufrufen:

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

verwandte Informationen