Linux

如果文件在副本中不存在,則不顯示錯誤,而不發送到 dev null

  • October 12, 2021

如果我嘗試 cp 一個不存在的文件,我想避免我的腳本發布錯誤。但是,我希望列印出任何其他錯誤的錯誤消息,例如權限不足。這意味著我無法將消息發送到 dev/null。在腳本中還有哪些其他解決方案可以做到這一點?

一種選擇是在複製之前檢查文件是否存在的 if 語句,但這種方法看起來相當混亂。我想我可以通過在文件名中添加 * 來獲得我想要的東西,儘管這似乎是一種奇怪的做事方式。是否有一些命令行參數或其他方式來獲得我想要的?

你可能會喜歡:

{ command <doesntexist cp doesntexist 2>&3 ; } 3>&2 2>/dev/null

在子shell中它可能更短……

( <file cp file ... 2>&3 ) 3>&2 2>/dev/null

但這似乎還有很長的路要走……

[ -r file ] && cp file ...

所有這些都只測試可讀文件 - 它們不適用於目錄……

但…

[ -e file ] && cp file ...

…可以…

檢查是否存在將減少問題,但在最一般的情況下,這是一個競爭條件。在檢查和複製嘗試之間仍然可以刪除文件。

也許只是擷取所有錯誤並刪除任何“文件不存在”。

普通副本:

$ 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

引用自:https://unix.stackexchange.com/questions/175065