获取命令“mv -n”的返回值linux

Hei*_*ana 3 shell mv

mv --help

-n, --no-clobber do not overwrite an existing file

user@pc:~/Desktop/test$ ls -l
total 16
-rw-r--r-- 1 user user 0 ago  6 20:28 bla
-rw-r--r-- 1 user user 0 ago  6 20:28 ble
user@pc:~/Desktop/test$ mv -n bla ble
user@pc:~/Desktop/test$
Run Code Online (Sandbox Code Playgroud)

有没有办法检查命令的返回值mv -n

是否可以执行类似于$?了解命令移动文件是否成功(返回 0)或失败(返回 1)的操作,因为目标文件夹中已经存在另一个同名文件?

xhi*_*nne 6

不,$?不会告诉您该-n选项是否阻止mv执行移动,因为在这种情况下退出状态将为 0。


解决方案1:您可以检查原始文件没有移动...

mv -n file1 file2
[ -e file1 ] && echo "Hmmm, mv didn't have any effect"
Run Code Online (Sandbox Code Playgroud)

但是,如果另一个程序在移动和测试之间同时重新创建 file1,则可能会出现竞争条件。


解决方案 2:由于您似乎使用 GNU mv,因此该-v选项有助于确定移动是否成功

if mv -v -n file1 file2 | grep -q .; then
    echo "The move succeeded"
fi
Run Code Online (Sandbox Code Playgroud)

随着-v,如果发生移动,mv将输出renamed 'file1' -> 'file2'。通过管道传输其输出以grep -q .测试是否mv在其标准输出上输出任何内容。

如果出现错误,mv将输出其标准错误,并且grep也会失败。