rsyncコマンドで『some files/attrs were not transferred』でたまにファイルがコピーされないエラーに対処する


※ 当ページには【広告/PR】を含む場合があります。
2024/08/15
【シェルコマンド基礎講座】rsyncコマンドの使い方を細かく検証しながらinclude/excludeのコツを覚える

rsyncコマンドを使っていると、異なるユーザーで共有しているファイルやアクセス元のOSプラットフォームの違いにより、
『some files/attrs were not transferred』のエラーでいくつかファイルが同期されない場合があります。

ファイルが同期されなかった原因は時と場合により様々原因が考えられますが、これに対処するには、
「rsyncコマンドのオプション」を見直してみることが効果的です。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

rsyncのコマンドオプションを最適化する

以前の記事内容で、
rsyncの基本的な使い方を紹介していたときに、「-av/-avP」をとりあえず付けておけば大抵のケースで上手くいきそう、とお茶を濁しておりました。

そんなこんなでコマンドオプションを深く考えずに使っていると、ふとしたときに以下のようなエラーに遭遇するときがあります。

            
            $ rsync -av --delete hoge/ ./
#ファイル書き込み時にエラー発生!
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.0]
...
        
この場合、rsyncコマンドでの書き込み先のフォルダへのファイル編集する権限が不足していたり、他のユーザーが対象のファイルを編集中でビジーであったりと、原因がいくつか考えられます。

これに対処するには、
"アーカイブモード"である「-a」オプションの役割を良く考えないといけないようです。

基本的なrsyncのコマンドオプション

rsyncコマンドのオプションは結構な種類がありますが、基本的ないくつかを把握すれば全部を細かく覚える必要はないでしょう。

参考|rsync(1) - Linux man page

個人的に必要最低限覚えておくと良いと思しきオプションを以下にピックアップしておきます。

オプション

意味

-a, --archive

アーカイブモード(-rlptgoD と同じ)

-r, --recursive

ディレクトリ階層以下をすべて対象とする

-l, --links

シンボリックリンクをそのまま維持してコピー

-p, --perms

ファイル・フォルダのパーミッションを維持してコピー

-t, --times

タイムスタンプを維持してコピー

-O, --omit-dir-times

--timesオプションでディレクトリは対象外にする

-g, --group

ファイル・フォルダのグループ情報を維持してコピー

-o, --owner

ファイル所有者情報を維持してコピー(rootのみ有効)

--devices

ブロックデバイスをコピー(rootのみ有効)

--specials

特殊ファイル(名前付きパイプやFIFO)をコピー

-D

デバイスの再作成(--devices --specials と同じ)

-H, --hard-links

ハードリンクをそのまま反映

-h, --human-readable

ファイルサイズのbytesをKやMで出力

-v, --verbose

コピーしたファイル名やバイト数などの転送情報を出力

-z, --compress

データ転送時に圧縮

--compress-level=NUM

NUMがゼロでない場合 --compress オプションが暗黙的に指定される

-c, -checksum

タイムスタンプとファイルサイズではなくチェックサムで差分を確認

-u, --update

転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない

-n, --dry-run

コピーや転送を実際には行わず転送内容のみ出力

--delete

転送元に存在しないファイルは削除

--exclude=PATTERN

同期から除外

rsyncコマンドの書き込み特化版オプションの一例

さて本題ですが、rsyncでいうアーカイブモードとは
「-aは-rlptgoD」のショートハンドだと分かります。

なので、ユーザーの書き込みをアーカイブモードからもっとゆるくしていけば、より"失敗しにくい"コピーになります。(※逆に言うと、ファイルやフォルダの権限情報が変更されてしまうリスクとはトレードオフですので利用は良く考えましょう。)

            
            -pオプション(パーミッション維持)を外す
-gオプション(グループ情報維持)を外す
-oオプション(オーナー情報維持)を外す
-Dオプション(デバイス再作成)を外す
-Oオプション(ディレクトリのタイムスタンプを保持しない)を付ける
        
ということで、ファイルやフォルダなどのパーミッション情報を極力無視して書き込みの成功率だけに重きを置いた場合のrsyncコマンドの使い方の一例が以下のようなものです。

            
            #rsync -av --delete hoge/ ./ を以下のコマンドオプションに置き換え
$ rsync -rlOtv --delete hoge/ ./
        

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

まとめ

以上、rsyncコマンドを利用するときのちょっとした問題を取り上げてみました。

アーカイブモード(-aオプション)はファイルコピーのスタンダードな設定を寄せ集められているので、コマンドを使う側からすると便利な反面、一部のファイルへの操作がコケてしまう恐れもあります。

コピーが失敗してしまったら、現在のコマンドオプションをじっくり考えてみてください。

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集