RSYNCはソースディレクトリを削除しません


27

rsyncを使用してサーバーからファイルを取得し、ローカルでファイルを取得したら、サーバーからファイルを削除します。私が実行している完全なコマンドは以下の通りです。

これにより、ソースサーバー上のファイルは正常に削除されますが、空のディレクトリは残ります。メッセージもエラーも表示されません。すべての出力は正常です。おそらくこれは意図した機能です。

ディレクトリを含むすべてを削除するようにrsyncに指示するにはどうすればよいですか?

rsync --progress -vrzh --remove-source-files

バージョンは両端とも3.0.9です。


回答:


13

--remove-source-files観察する動作は、以下で指定されたとおりですman rsync

--remove-source-files

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

StackExchangeServerFaultのこれら2つの説明が明確に示すように、ディレクトリを削除するための特定のコマンドはありません。解決策は、2つの個別のコマンドを発行することです。

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete `mktemp -d`/ source/ 

これらの2つの投稿で提案されたコマンドの最後の部分は、

 rmdir source/

OPと回答がrsyncを使用して同じマシン内で大量のファイルを移動しているため、(空になった)ソースディレクトリを削除するために必要です。あなたの場合、これを手動で行う必要があります。


5
このrsync --delete提案は、rsyncが完了しなかったか、ソースに新しいファイルがある可能性を無視するため、危険です。find以下の@slhckのメソッドの方がはるかに安全です。
サイ

29

マンページには次のようにも書かれています:

--remove-source-files   sender removes synchronized files (non-dirs)

ソースの空のディレクトリを削除する場合、まだファイルが残っている場合は、次の手順を実行します。

find . -depth -type d -empty -delete

ただし、空のルートディレクトリの場合rm -rf <directory>は、もちろん十分です。


5
ええ、これが唯一の解決策です。これは、rsyncの愚かな欠落機能のようなものです。rsyncは、ディレクトリ内の最後のファイルをいつ処理したかを知っています。
エリックアロネスティ14年

4
「rm -rf」の発行は競合状態になりやすいので注意してください。
ラウルサリナスモンテグード

トップレベルの空のディレクトリを消去しないバリアント:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind

5

rm -rf」を使用すると、固有の競合状態が発生します。つまり、rsync呼び出しとrm呼び出しの間に作成されたファイルを削除できます。

私は使用したい:

rsync --remove-source-files -a server:incoming / incoming / &&

sshサーバーは、着信-type d -deleteを検出します

空でないディレクトリは削除されません。


2
またrm -rf、何らかの理由で転送されなかったファイルも削除されます。
クリスチャン

1
この答えは、正しい順序で処理する-depthよう指示findするオプションを逃しています。このミスの結果として、空のディレクトリのみ(おそらく再帰的に)を含むディレクトリは削除されません。@slhckによる変種はそれを正しく持っています。
ステフェイン・グーリッホン

1

-m, --prune-empty-dirs file-listから空のディレクトリチェーンを削除する

--force 空でない場合でも、強制的に削除します


1
これは、rsyncが空のディレクトリをコピーするのを防ぐだけです。空のディレクトリは削除されません。
ナビン

1

ソースファイルを削除してから、ディレクトリを削除して安全にします。

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

GNU Parallelの詳細

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.