バックアップスクリプトを作成しようとしています。私はこのスクリプトをCentOS 6.7システムで動作させ、Debian 7で動作させようとしています。
Googleやこのサイトで見つけることができる情報で解決できない問題に直面しました。この問題を議論する前に、私の状況を説明しようとします。
CentOSでは、過去24時間に変更されたファイルを見つけて、次のコマンドを使用$SOURCEDIR
します。xargs
$ARCHIVE
find $SOURCEDIR -mtime -1 -print | xargs -r tar rcvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }
tar rcvf
以下を使用して、次のエラーメッセージを呼び出すことができることを知っています。
「-Acdtrux」または「--test-label」オプションを複数指定することはできません。
しかし、CentOSシステムではこれが起こらないようです。それするDebianシステムでは、コマンドラインからr
そのコマンドを削除しましたtar
。最初にこれを追加したのは、find
100以上の結果が返されたときにアーカイブを上書きするのを防ぎたかったからです。
今、実際の問題に進みます。走るたびに
find $SOURCEDIR -mtime -1 -print
$SOURCEDIR
予想通り、過去24時間に変更されたファイルのリストが表示されます。しかし、xargs
パイプシンボルと次の完全なコマンドを実行するたびに:
find $SOURCEDIR -mtime -1 -print | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }
find
実際にコマンドが印刷されるのを見ました。みんなファイルは、$SOURCEDIR
以下を含むアーカイブのインポートから来ます。みんなファイルから$SOURCEDIR
理由を理解できません。どんな助けでも大変感謝します。
ベストアンサー1
他の人が指摘したように、コマンドの問題は、そのコマンドにディレクトリが含まれており、tarがそのディレクトリを再帰的に保持することです。ディレクトリが最近変更された場合は、その変更に関係なく、そのディレクトリとそのサブディレクトリ内のすべてのファイルが含まれます。
ディレクトリメタデータをバックアップしたくない場合は、find
ディレクトリ名を印刷しないように指示します。単にルートディレクトリを省略するだけでは不十分です。サブディレクトリでも同様です。
find "$SOURCEDIR" -mtime -1 ! -type d -print | xargs -r tar -rcf "$ARCHIVE"
xargsの使用ファイル名にスペースやその他の特殊文字が含まれていると失敗します。。これは修正が簡単です。-exec
代わりにを使用してくださいxargs
。
find "$SOURCEDIR" -mtime -1 ! -type d -exec tar -rcf "$ARCHIVE" {} +
ディレクトリメタデータをバックアップするには、find
すべての内容を印刷してからtar
サブディレクトリに繰り返さないように指示します。find
再帰が行われるので、これはtar
必要ありません。
find "$SOURCEDIR" -mtime -1 -exec tar -rcf "$ARCHIVE" --no-recursion {} +
これにより、tar呼び出しを使用せずに最初にルートディレクトリのみをtar -rc
含むアーカイブを作成し、それを一括追加して繰り返しtar呼び出しの問題を解決できます。 (なぜルートディレクトリですか?GNU tarは空のアーカイブを作成するのを恐れているからです。)
tar -cf "$ARCHIVE" --no-recursion "$SOURCEDIR"
find "$SOURCEDIR" -mindepth 1 -mtime -1 -exec tar -rf "$ARCHIVE" --no-recursion {} +