![有没有办法让“mv”默默地失败?](https://linux22.com/image/45769/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E8%AE%A9%E2%80%9Cmv%E2%80%9D%E9%BB%98%E9%BB%98%E5%9C%B0%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
mv foo* ~/bar/
如果没有匹配的文件,则类似命令会在 stderr 中生成此消息foo*
。
mv: cannot stat `foo*': No such file or directory
但是,在我正在处理的脚本中,这种情况完全没问题,并且我想从日志中忽略该消息。
mv
即使没有任何东西移动,有什么好的方法可以告诉你保持安静吗?
答案1
您在找这个吗?
$ mv file dir/
mv: cannot stat ‘file’: No such file or directory
$ mv file dir/ 2>/dev/null
# <---- Silent ----->
答案2
实际上,我认为静音mv
不是一个好方法(请记住,它可能还会向您报告其他可能感兴趣的事情......例如,missing ~/bar
)。仅当您的 glob 表达式不返回结果时,您才需要将其静音。事实上,根本不执行它。
[ -n "$(shopt -s nullglob; echo foo*)" ] && mv foo* ~/bar/
看起来不太吸引人,并且仅适用于bash
.
或者
[ 'foo*' = "$(echo foo*)" ] || mv foo* ~/bar/
除非你在集合bash
中nullglob
。不过,您要付出 3 倍重复 glob 模式的代价。
答案3
find . -maxdepth 1 -name 'foo*' -type f -print0 | xargs -0r mv -t ~/bar/
— GNUmv
有很好的“目的地优先”选项 ( -t
),并且xargs
如果根本没有输入,可以跳过运行其命令 ( -r
)。使用-print0
和-0
相应地确保当文件名包含空格和其他“有趣”的东西时不会出现混乱。
答案4
这可能不是最好的,但您可以使用find
命令检查文件夹是否为空:
find "foo*" -type f -exec mv {} ~/bar/ \;