web-dev-qa-db-ja.com

rsyncでフォルダーを移動するときに空のソースディレクトリを削除する方法

rsyncは、次のオプションを使用して、従来のmvと非常によく似た移動フォルダにまとめることができます。

rsync -axvvES --remove-source-files source_directory /destination/

ただし、まだ実現できていないように見えるのは、元のディレクトリを削除することです。 --remove-source-filesフラグは、ソースファイルを削除しますが、ソースディレクトリは削除しません。 --remove-source-directoriesフラグもあるといいのですが、ありません。

これにどのように対処できますか?移動後にrm -frを発行できると思いますが、手順をすべて1つのプロセスで維持することをお勧めします。

8
ylluminate

私は一度にそれを行うコマンドを見つけていませんが、rsyncはrm -rfよりもパフォーマンスが優れているため(特に、非常に多数のディレクトリがある場合)、次の2つのrsyncコマンドが"移動"

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

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

私は使いたい:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

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

私も同じような状況になりました。避けたかったrm -rf、rsyncが一部のファイルのコピーに失敗したことを知っていて、それらを失いたくありませんでした。

空のディレクトリを単に削除するために、これが最も便利であることがわかりました(sourcedirから):

find . -type d -empty -delete
3
lp_

なぜrm -rf source_directory rsyncの後で?

rsync -axvvES --remove-source-files source_directory /destination/ && rm -rf source_directory

各コマンドラインプログラムは、(理想的には)指定されたタスクを実行するように作成されています。複数のコマンドラインプログラムを組み合わせてより複雑なタスクを実行するのは、ユーザー次第です。

2
Gregory MOUSSAT