Problem: I'm looking for a way to rename or copy a file without overwriting the destination file, if it exists, and then check the success of the move or copy operation. I'm seeking a method that will work with the BSD versions of mv/cp installed on MacOS/Unix, and also the GNU coreutils versions I have on Linux.
Solution attempt:
In all versions of mv/cp, I can prevent overwriting the destination file with the -n
flag:
mv -n file1 file2
cp -n file1 file2
Similar questions suggest testing the success of mv and cp using the exit status, which is 0 if successful and >0 if an error occurred. However, for both versions of mv/cp, the exit code is 0 when the destination file already exists and the -n
flag is used.
The only other option I can think of is to also use the -v
flag, and look at the output of the command:
mv -nv file1 file2
cp -nv file1 file2
However, the GNU and BSD versions of mv/cp behave differently when the -nv
flags are used and file2 already exists: the GNU versions of mv/cp return nothing, whereas the BSD versions return file2 not overwritten
.
Our previous method was to check whether the destination file exists first, then do the mv/cp operation. Believe it or not, this caused problems because the destination file would sometimes get created by another process between the time that the check was performed and the mv/cp operation was executed.
Is there a way to accomplish this task that works with both BSD and GNU versions of mv/cp?
Alternatively, is there are way to do this using Python 2? I couldn't find a way to do this using os.rename()
os.open("file", os.O_CREAT|os.O_EXCL)
? – srcerer Jan 25 '19 at 20:20O_EXCL
, didn't feel like checking through all the implications (in two different languages). If you want to accept (and/or write) an answer that provides more detail, that's fine. – sourcejedi Jan 25 '19 at 21:17bash
is not as conveniently available for whichever OS X setups you are targeting... Sorry I don't know what exactly to suggest to make the question unambiguous to me, but it's why I originally posted as a comment, saying ifbash
was available. If you had only needed Linux instructions I think there would be nothing to stop me upvoting; I like thinking about the general topic. – sourcejedi Jan 25 '19 at 21:42bash
is available. I was aiming for a little collaboration... actually looks like OS X providesbash
, it's general BSD that you can't rely on it being there, although looking at the versions I am not sure whether it is a good plan on OS X... https://unix.stackexchange.com/questions/82244/bash-in-linux-v-s-mac-os – sourcejedi Jan 25 '19 at 22:18