如果文件在副本中不存在,则不显示错误,而不发送到 dev null

如果文件在副本中不存在,则不显示错误,而不发送到 dev null

如果我尝试 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

笔记:

空间之前/之后方括号是强制性的,不会破坏上面的命令。

参考: https://linuxize.com/post/bash-check-if-file-exists/

相关内容