Почему опция -x exclude в zip на самом деле не исключает путь?

Почему опция -x exclude в zip на самом деле не исключает путь?

Используя Raspbian на Raspberry Pi, я хочу сделать резервную копию файлов /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") на самом деле не является знаком ASCII-минус в вопросе OP. Вместо этого это Unicode u+2013 (выглядит так же, но действует иначе).

Если команда введена так, как и ожидалось, то она работает так, как и ожидалось для последнего примера автора (исправлено здесь):

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

Вероятно, это проблема, возникшая в результате копирования/вставки с какого-то веб-сайта.

Дальнейшее чтение:

решение2

Со man zipстраницы:

zip -r foo foo -x \*.o

что включит содержимое foo в foo.zip, исключив все файлы, заканчивающиеся на .o. Обратная косая черта позволяет избежать подстановки имени файла оболочки, поэтому сопоставление имен выполняется zip на всех уровнях каталогов.

Вы должны убедиться, что ваш glob *расширен не оболочкой, а 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)

Связанный контент