web-dev-qa-db-ja.com

権限を保持せずにファイルを移動する方法

問題は、ファイルを移動するときにエラーを表示したいが、権限の問題に関するエラーは表示したくないことです。つまり、ファイルが完全に送信されていないかどうかは気になりますが、次のようなエラーは表示したくありません。

mv:「/home/blah/backup/pgsql.tar.gz」の所有権を保持できませんでした:操作は許可されていません

だから私は次のようなものが欲しい:mv $backupfile $destination --ignore-permissions

バックアップファイルは、1 MiBから5までの任意の値にすることができますGiBで、NFSを介して転送されます。

45
Nux

mvは、このジョブには不適切なツールです。 cpが必要で、次にrmが必要です。ファイルを別のファイルシステムに移動しているので、これはmvがファイルの許可ビットと所有者/グループ情報を保持しようとしていることを除いて、とにかく裏でmvが行っていることです。これは、mvが同じファイルシステム内でファイルを移動していて、mvが両方の状況で同じように動作しようとすると、その情報が保持されるためです。ファイル許可ビットと所有者/グループ情報の保持を気にしないので、そのツールを使用しないでください。使用する cp --no-preserve=modeおよびrm代わりに。

63
Kyle Jones

同じファイルシステム内でファイルを移動すると、mvはファイルを古い場所から切り離し、新しい場所に接続します。権限などのメタデータは変わりません。ファイルを別のファイルシステムに移動すると、mvはファイルをコピーし、できるだけ多くのメタデータの複製を試み、元のファイルを削除します。

別のファイルシステムに移動していて、あまり多くのメタデータを複製したくないので、ファイルをコピーしてから元のファイルを削除することもできます。

cp "$backupfile" "$destination" && rm "$backupfile"

これにより、ファイルの権限がある程度保持されます(例:世界中の読みやすさ、実行可能性)。ファイルの変更時刻は保持されません。 GNU cp を使用すると、--preserve=…オプションにより、どのメタデータをより細かくレプリケートするかを制御できます。 --preserve=mode,timestamps

rsyncを使用して、何を保存するかを指定することもできます。オプション -aは、「ほとんどのメタデータを保持する」ことを意味し、rootとしてのみ実行されている場合の所有者も含まれます。

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"