zipの-x除外オプションが実際にパスを除外しないように見えるのはなぜですか?

zipの-x除外オプションが実際にパスを除外しないように見えるのはなぜですか?

Raspberry PiでRaspbianを使用して/ etcファイルをバックアップしたいのですが、すべてではありません。 /etc/alternativesを除外したかったので、次のコマンドを使用しました。

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

なぜこれがうまくいかないのですか? /etcの他のすべてのフォルダと同様に、/etc/alternativesの内容は引き続き含まれます。

これらのバリエーションを試しましたが、どちらも機能しません。

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

recursive -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で終わるすべてのファイルは除外されます。バックスラッシュはシェルファイル名の置き換えを防止するので、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)

関連情報