web-dev-qa-db-ja.com

rsync:mkdir "2014-11 /。"失敗:そのようなファイルまたはディレクトリはありません(2)

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]

`このエラーをどのように修正すればよいですか?私を助けてください

4
syntaxerro

まず、ターゲット上の親ディレクトリが存在することを確認します。つまり[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文字です。

3
mc0e

末尾のドットを削除する必要があります。スクリプトを次のように変更します。

rsync -au --ignore-existing /var/www/uploads/$NOW/* -e [email protected]:/var/www/uploads/$NOW
2
derdigge

これを試して、rsyncが宛先に必要なすべてのディレクトリを作成するようにします。

NOW=$(date +"%Y-%m")
rsync -au --ignore-existing --relative /var/www/uploads/$NOW [email protected]:/var/www/uploads/
  • 追加された--relative rsyncで宛先にディレクトリツリーを作成します。
  • ソースの後にスラッシュがないため、最後のディレクトリ( "$NOW ")は、コンテンツだけでなく、宛先でも作成されます。
  • 「$ NOW」は必要に応じて作成されるため、宛先から削除されました。
  • あなたの孤独を取り除いた-e間違いのように見えるオプション(引数が必要です: "このオプションを使用すると、通信に使用する別のリモートシェルプログラムを選択できます" )。

または、詳細と代替案について この回答 を参照してください。

0
mivk