Rsync はスクリプト内で呼び出されると動作が異なります。

Rsync はスクリプト内で呼び出されると動作が異なります。

だから私はバックアップスクリプトを書いていますが、.isoファイルをスキップしたいと思います。

コマンドラインでコマンドを使用すると、すべてがうまく機能します。

rsync -a --delete --exclude='*.iso' /home/user/Desktop/Work /mnt/profile/Desktop/

ただし、スクリプトで使用しようとすると、「除外」設定は適用されず、.isoファイルはコピーされ続けます。スクリプトは次のとおりです。

#!/bin/bash
set -e

SRC_DIR="/home/user/Desktop/Work"
DST_MOUNTPOINT="/mnt/profile"
DST_DIR="/mnt/profile/Desktop/"
OPTIONS=" --exclude='*.iso' "

mountpoint -q $DST_MOUNTPOINT || mount $DST_MOUNTPOINT

rsync -a --delete $OPTIONS $SRC_DIR $DST_DIR

スクリプトを実行してPIDを取得して/proc/PID/cmdlineを確認すると、除外設定があります。

私は何が間違っていましたか?

ベストアンサー1

除外パターンの周りに引用符を付けます。

OPTIONS=" --exclude='*.iso' "
rsync $OPTIONS

ここではOPTIONSコマンドラインで引用されていないため、単語の区切りが発生し、末尾のスペースは削除されます。ただし、文字列の単一引用符はそのまま残り、ファイル名の先頭と末尾に引用符を含めることはできないため、パターンは一致しません。<space>--exclude='*.iso'<space>rsyncrsync

追加の引用符(およびスペース)を削除し、変数を引用します。

OPTIONS="--exclude=*.iso"
rsync "$OPTIONS" "$SRC_DIR" "$DST_DIR"

おすすめ記事