これは私が使用するスクリプトです:
find /path/backups/ -type f -mtime -2 -printf '%P\n' | rsync -avz --progress --delete --exclude-from=- -e "ssh -p 512" /path/backups/ me@Host:/remote/path/server-backups/
これはログからのものです:
> Jan 21 15:32:01 servername CRON[14654]: (serveruser) CMD (find /path/backups/ -type f -mtime -2 -printf ')
cron.d
、crontab -e
、およびcron.daily
を使用してみました。 crontab
ファイルにスクリプトを直接配置することと、.sh
スクリプトファイルを呼び出すことの両方。これを解決する方法はありますか?
%
はcron
で特別な意味を持つため、コマンドは切り捨てられます。 man 5 crontab
から:
The ``sixth'' field (the rest of the line) specifies the command to be
run. The entire command portion of the line, up to a newline or %
character, will be executed by /bin/sh or by the Shell specified in the
Shell variable of the crontab file. Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac‐
ters, and all data after the first % will be sent to the command as
standard input. There is no way to split a single command line onto
multiple lines, like the Shell's trailing "\".
ログに記録されたコマンドが次のように見える理由を説明します。
CMD (find /home/steeldriver/forums/tests -type f -mtime +1 -printf ')
エスケープが機能することを示すために、以下を指定します。
$ ls -l tests
total 12
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 22 Oct 27 22:18 A9E27.txt
-rw-rw-r-- 1 steeldriver steeldriver 10 Oct 27 22:19 ffn2eG6.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
次に、crontabを次のように追加します。
* * * * * find /home/steeldriver/forums/tests -type f -mtime +1 -printf '\%P\0' | rsync -0av --exclude-from=- /home/steeldriver/forums/tests/ /home/steeldriver/forums/newtests/ 2>&1 > /home/steeldriver/forums/backup.log
(これはnullで終わるフォーム\0
を使用することに注意してください)ログファイルを生成します。
$ cat backup.log
sending incremental file list
created directory /home/steeldriver/forums/newtests
./
A8eVAmK.txt
sBHFgkv.txt
sent 250 bytes received 113 bytes 726.00 bytes/sec
total size is 43 speedup is 0.12
バックアップが正常に実行され、新しいファイルのみがコピーされたことを示します。
$ ls -l newtests
total 4
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
ご使用のcrontabの外部でエスケープをテストすることはできません。ターミナルでは、エラーが発生しますfind
。
別のアプローチをお勧めします。一時ファイルを使用すると、作業が楽になり、cronジョブで問題を引き起こす可能性のあるパイプの使用を避けることができます。
ここでのプロセスはかなり簡単です。最初にコマンドを発行する
find ./ -daystart -mtime +2 >myfile
注:
上記は整数日を使用するため、2〜3日前のファイルと一致します。*必要に応じて変更するか、より正確な選択のために-mminとminutesを使用します。一致する結果はファイルmyfileに書き込まれ、コマンドが実行されるたびに上書きされます。
次にコマンドを発行します:sed 's|./||' myfile >EXCL_list
不要なプレフィックスを取り除きます。ファイルEXCL_listは、コマンドが実行されるたびに上書きされます。
最後にコマンドを発行します:
rsync -Pav --exclude-from=EXCL_list --delete-excluded source/ dest
rsyncスイッチの説明:
-P
--partial --progressと同じ
-a
アーカイブモード
-v
詳細
--exclude-from=EXCL_list
FILEから除外パターンを読み取ります
--delete-excluded
また、dest dirsからexcluded filesを削除します
詳細情報およびその他のオプションの詳細については、man rsync
仮定:
コマンドは、処理するファイルとフォルダーを含むソースディレクトリで実行されます。
rsyncコマンドのdestは、書き込み権限があるマウントされた宛先です。
これが役立つことを願っています。
ソース:
http://www.linuxquestions.org/questions/linux-general-1/rsync-only-60-day-old-files-580357
https://serverfault.com/questions/279609/what-exactly-will-delete-excluded-do-for-rsync
man find
man rsync