【问题标题】:Get return value of command "mv -n" linux获取命令“mv -n”linux的返回值
【发布时间】:2020-11-27 06:45:49
【问题描述】:

来自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$

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

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

【问题讨论】:

  • 退出代码会告诉你文件是否被移动/重命名。如果您需要以编程方式分析失败的原因(在非零退出代码的情况下),您可以解析mv 打印的错误消息。
  • @user1934428 "退出代码将告诉您文件是否已被移动/重命名"。这对我来说是不正确的。这就是您的 mv 版本的行为方式吗?我的是 8.28,它的文档指出“非零值表示失败”。同样,POSIX 声明当发生错误时退出值非零。中止移动(使用mv -imv -n)不是失败,我的 mv 相应地以 0 退出。你用的是什么版本的mv?
  • 这不一样吗?我的 mv (GNU mv) 手册页对退出代码保持沉默,但这是一个通用约定,非零表示失败,对于 mv,失败 is没有搬家,所以我想。如果不是这种情况,您可以执行mv -nv 并解析写入标准输出的消息。
  • @user1934428 非零确实意味着失败,但mv -n foo bar 在 bar 存在时不将 foo 移动到 bar 不是失败,该命令成功地按照您在这种情况下的指示进行操作,并将以状态零退出(成功)。

标签: shell mv


【解决方案1】:

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


解决方法一:你可以检查一下原始文件没有移动...

mv -n file1 file2
[ -e file1 ] && echo "Hmmm, mv didn't have any effect"

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


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

if mv -v -n file1 file2 | grep -q .; then
    echo "The move succeeded"
fi

使用-v,如果发生移动,mv 将输出renamed 'file1' -> 'file2'。将其输出传送到grep -q . 测试mv 是否在其标准输出上输出任何内容。

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

【讨论】:

  • 谢谢!我非常感激。现在“mv -n”行为更加清晰。我特别喜欢第二种解决方案,但两者都值得。
【解决方案2】:

如何比较 cmd 前后文件的时间戳。 类似于:https://github.com/shasan101/bash_for_fun/blob/master/files_comparison_by_time.sh

【讨论】:

  • 这更像是对问题的评论,而不是真正的答案。为了使它成为一个有用的答案,您应该发布一个代码示例以及您的解释。总而言之,你的建议不错,但就像我的第一个建议一样,这很容易出现竞争条件。
【解决方案3】:

与其尝试执行移动然后测试移动失败,因为目标文件存在,只需在尝试执行移动之前测试目标文件是否存在,例如:

[[ ! -f ble ]] && mv bla ble || { ret=$?; echo "failed to move bla to ble: $ret" >&2; exit "$ret"; }

如果 ble 存在或 mv 失败并且它在失败时退出,则会输出错误消息,按摩以适应,例如也许你更喜欢:

[[ -f ble ]] && { ret=$?; echo "warning ble exists so skipping it" >&2; }
[[ $ret == 0 ]] && mv bla ble

或者一个简单的 if-else:

if [[ -f ble ]]; then
    echo "warning ble exists so skipping it" >&2
else
    mv bla ble
fi

【讨论】:

  • 当然!我没有想过这种方法。我很感激,谢谢。
猜你喜欢
  • 2022-12-16
  • 2017-01-13
  • 2020-08-24
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多