上書きせずに移動またはコピーし、成功したかどうかを確認する

上書きせずに移動またはコピーし、成功したかどうかを確認する

質問: ターゲットファイル(存在する場合)を上書きせずにファイル名を変更するか、ファイルをコピーして移動またはコピー操作が成功したことを確認する方法を探しています。 MacOS / Unixにインストールされているmv / cpのBSDバージョンとLinuxのGNU coreutilsバージョンで利用可能な方法を探しています。

試すことができる回避策: すべてのバージョンのmv / cpで、次のフラグを使用してターゲットファイルを上書きするのを防ぐことができます-n

mv -n file1 file2
cp -n file1 file2 

同様の質問では、終了ステータスを使用してmvとcpが成功したか、成功した場合は0か、エラーが発生した場合は> 0かどうかをテストすることをお勧めします。ただし、両方のバージョンのmv / cpは、ターゲットファイルがすでに存在し、-nフラグが使用されている場合、終了コードは0です。

私が考えることができる唯一の他のオプションは、その-vフラグも使用し、コマンドの出力を調べることです。

mv -nv file1 file2
cp -nv file1 file2

-nvただし、mv / cpのGNUおよびBSDバージョンは、フラグが使用されてfile2がすでに存在する場合は異なる動作をします。 mv / cpのGNUバージョンは何も返しませんが、BSDバージョンは返しませんfile2 not overwritten

以前の方法は、まずターゲットファイルが存在することを確認してから、mv / cp操作を実行することでした。信じられないかもしれませんし、スキャンが実行される時間とmv / cp操作が実行される時間の間にターゲットファイルが他のプロセスによって生成されることがあるため、これは問題を引き起こす可能性があります。

mv / cpのBSDおよびGNUバージョンを使用してこれを行う方法はありますか?

または、Python 2を使用してこれを行う方法はありますか? os.rename() を使用してこれを行う方法を見つけることができません。

ベストアンサー1

あなたbashが持っているなら -https://stackoverflow.com/questions/13828544/atomic-create-file-if-not-exists-from-bash-script

set -o noclobber
{ > file ; } &> /dev/null

fileというファイルがない場合、このコマンドはfileというファイルを生成します。 fileというファイルが存在する場合、何もしません(ただし、ゼロ以外の戻りコードが返されます)。

つまり、まずこの技術を使用して空のファイルを作成します。成功すると、空のファイルを上書きできます。

Pythonの場合も同様です。空のファイルを作成するために使用され、フラグをos.open()含める必要があります。O_EXCL(「フラグとモード値の説明については、Cランタイムのドキュメントを参照してください。」POSIX規格/Linuxのマニュアルページ)。


bash技術はO_EXCL背後で使用されます。しかもRENAME_NOREPLACEしかし、Linuxには比較的新しいアドオンであり、OS Xには存在しないようです。

おすすめ記事