web-dev-qa-db-ja.com

--forceオプションを使用しても、rsyncで「空でないディレクトリを削除できない」エラーが発生する

このコマンドを実行すると:

$ Sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

次の出力が表示されます。

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

man rsyncを読むと、--forceオプションがrsyncにこれらの空でないディレクトリを削除するように指示するのが私の印象でした。これは望ましい結果です。

参照:

--force                 force deletion of dirs even if not empty

空でないディレクトリを削除するようにコマンドを変更するにはどうすればよいですか?

Gentoo Base Systemリリース2.0.3でrsyncバージョン3.0.8を使用しています。

pdate:コマンドにSudoを追加して、これがファイル権限の問題ではないことを明確にしました。

29
tommarshall

追加しようとしましたか--delete-excluded

「リモート」側で除外されたフォルダのディレクトリを削除すると、rsync --deleteは、「ローカル」サイトの除外されたフォルダを削除しません。

42
Martin Höger

この問題の考えられる原因は次のとおりです。

(1)このエラーは-b(--backup)オプションの結果である可能性があります。このオプションは、ファイル名にチルダ()を追加することにより、削除された各ファイルのバックアップを作成します。 (ファイル名は明らかにバックアップですが、チルダが見えないのでディレクトリ名はそうではないので、これは私を混乱させました。)

これが同じケースであるかどうかを確認するには、最も深いレベルでターゲットディレクトリを読み取り、チルダ(〜)終了ファイルがあるかどうかを確認します。これらのチルダ付きファイル名は、一部の一般的なファイル参照システムでは表示されないため、表示されない場合があることに注意してください。

この問題を解決するには、-backup-dir = DIRオプション(たとえば、-backup-dir = .rsync_bak)を使用します。

(2) --excludeオプションでも同じ結果が得られます。これはあなたのケースでおそらく起こっています。パターンシステムは強力ですが、誤解を招く可能性があります。たとえば、-exclude = '*〜'と指定すると、チルダ終了ファイルがすべてスキップされ、上記のケース(1)とまったく同じ結果になります。

rsyncのmanページから:

パターンが/で始まる場合は、ファイルの階層内の特定の場所にアンカーされます。それ以外の場合は、パス名の末尾と照合されます。

--exclude = uploadsと書くと、ファイルツリーのanyレベルで、「updloads」という名前のすべてのファイルが除外されます。

削除できないディレクトリ内に「uploads」という名前のファイルがあるかどうかを確認します。

解決策は、「-exclude = uploads」を「--exclude = uploads /」に変更することです。

6
user3586623

--excludeではなく、フィルターファイルでルールを使用します。これらを使用すると、除外を「永続化可能」としてマークできます。これにより、除外されたファイルを含む空でないディレクトリを削除できます。

詳細は this answer を参照してください。

0
mivk

私の設定((ソースはUbuntuフォーマットタイプext4をターゲットにしてWestern Digitalタイプのfuseblkです)で動作します:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
0
InLaw