如果我尝试 cp 不存在的文件,我想避免我的脚本发布错误。但是,我希望打印出任何其他错误的错误消息,例如权限不足。这意味着我无法将消息发送到 dev/null。还有哪些其他解决方案可以在脚本中执行此操作?
一种选择是使用 if 语句在复制之前检查文件是否存在,但这种方法似乎相当混乱。我想我可以通过在文件名中添加 * 来获得我想要的东西,尽管这似乎是一种奇怪的做事方式。是否有一些命令行参数或其他方式来获得我想要的东西?
答案1
你可能会喜欢:
{ command <doesntexist cp doesntexist 2>&3 ; } 3>&2 2>/dev/null
在子外壳中它可能会更短......
( <file cp file ... 2>&3 ) 3>&2 2>/dev/null
但这似乎还有很长的路要走......
[ -r file ] && cp file ...
所有这些都只测试可读文件 - 它们不适用于目录......
但...
[ -e file ] && cp file ...
...可以...
答案2
检查是否存在会减少问题,但在最常见的情况下,这是一个竞争条件。在检查和复制尝试之间仍然可以删除该文件。
也许只是捕获所有错误并删除任何“文件不存在”的错误。
普通副本:
$ cp noexist bar /tmp
cp: cannot stat `noexist': No such file or directory
cp: cannot open `bar' for reading: Permission denied
修改的
$ cp noexist bar /tmp 2>&1 | grep -v "No such file or directory" >&2
cp: cannot open `bar' for reading: Permission denied
答案3
只需检查如果目录/文件已经存在:
复制一个文件
file=path/to/the/file/to/copy && [ -f "${file}" ] && cp ${file} destination/path/here
复制一个目录
dir=path/to/the/dir/to/copy && [ -d "${dir}" ] && cp -r ${dir} destination/path/here
笔记:
空间之前/之后方括号是强制性的,不会破坏上面的命令。