web-dev-qa-db-ja.com

RSYNCがソースディレクトリを削除しない

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

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

ディレクトリを含むすべてをクリーンアップするようにrsyncに指示するにはどうすればよいですか?

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

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

28
Sajan Parikh

観察する--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.

StackExchange および ServerFault でのこれら2つの説明から明らかなように、ディレクトリを削除する特定のコマンドはありません。解決策として、2つの個別のコマンドを発行することが提案されています。

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

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

 rmdir source/

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

16
MariusMatutiae

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

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

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

find . -depth -type d -empty -delete

空のソースディレクトリの場合は、rmdir <directory>もちろん十分です。

31
slhck

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

私は使用することを好む:

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

sshサーバーが着信-type d -deleteを見つける

空でない場合、これはディレクトリを削除しません。

-m, --Prune-empty-dirsファイルリストから空のディレクトリチェーンを削除します

--force空でない場合でもディレクトリを強制的に削除します

1
MarcoP

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

# 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