rsyncを使用してserver-aからserver-bにファイルを自動コピーするスクリプトを作成しています。これが私のスクリプトです。
#!/bin/bash
NOW=$(date +"%Y-%m")
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e [email protected]:/var/www/uploads/$NOW/.
10月から11月のような次の月に行くと、スクリプトで次のエラーが発生します。
`
rsync: mkdir "/var/www/uploads/2014-11/." failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(605) [Receiver=3.0.9]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
`このエラーをどのように修正すればよいですか?私を助けてください
まず、ターゲット上の親ディレクトリが存在することを確認します。つまり[email protected]:/var/www/uploads
が存在する必要があります。あなたの定式化では、末尾の.
は、rsyncが作成しようとするディレクトリを参照していると思います。親ディレクトリがすでに存在しない限り、そうすることはできません。つまり、親は[email protected]:/var/www/uploads/$NOW
です。
次に、rsyncの動作がcpと微妙に異なり、ファイル名の末尾に「/」が付いていることを理解してください。物事を行うための最も安全で直感的な方法は、すべてのディレクトリの末尾に/
を使用することです。そのようです:
rsync -au --ignore-existing /var/www/uploads/$NOW/ -e [email protected]:/var/www/uploads/$NOW/
Cpとは異なり、rsyncはsource引数のディレクトリのコンテンツを確実にターゲットディレクトリのコンテンツにコピーし、必要に応じてターゲットディレクトリを作成し(親は存在する必要があります)、ソースディレクトリ(つまり、親)を内部に配置しませんターゲットがすでに存在する場合は、ターゲットディレクトリ。
これは、ソースディレクトリの名前が.
で始まる名前のファイルを除外し、コピーされるファイルのリストが長すぎると失敗する(bashメモリが正しく機能している場合、コマンドラインの長さの合計は約32K文字です。
末尾のドットを削除する必要があります。スクリプトを次のように変更します。
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e [email protected]:/var/www/uploads/$NOW
これを試して、rsyncが宛先に必要なすべてのディレクトリを作成するようにします。
NOW=$(date +"%Y-%m")
rsync -au --ignore-existing --relative /var/www/uploads/$NOW [email protected]:/var/www/uploads/
--relative
rsyncで宛先にディレクトリツリーを作成します。$NOW
")は、コンテンツだけでなく、宛先でも作成されます。-e
間違いのように見えるオプション(引数が必要です: "このオプションを使用すると、通信に使用する別のリモートシェルプログラムを選択できます" )。または、詳細と代替案について この回答 を参照してください。