cp -a foo/* bar/
會將 foo 的內容複製到 bar 中,取代任何已存在的檔案。我可以使用 -n 標誌來cp
不覆蓋現有文件或-i
使其以互動方式詢問是否覆蓋文件。
問題
cp
如果文件已經存在,有沒有辦法讓失敗並傳回錯誤代碼?- 如果沒有,是否可以使用
rsync
其他常用工具?
答案1
Linux
如果檔案存在於 Linux 上,則透過 GNU 的輕微修改可能會失敗nohup
。nohup
重定向/dev/null
到stdin
,因此任何互動式提示都會被忽略,但將使用stdin
視為失敗。
$ nohup cp -ia foo/* bar/
清理一下:
$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
- 預設重新
nohup
導向stdout
到nohup.out
和stderr
。stdout
2>nohup.out
也放入stderr
文件中。- 將
&& rm || cat
在成功時清除或nohup.out
在錯誤時輸出錯誤。您可以添加任何您想要的錯誤處理,而不是/包括或刪除所有這些並正常cat
處理。$?
- 如果您認真使用它,您將需要對臨時檔案位置更加了解 (
mktemp -d
)
BSD
在 BSD 上,您可以重新導向stdin
到cp
將被視為n
並傳回非 0 狀態的位置。
$ cp -ia foo/* bar/ </dev/null
作業系統X
令人驚訝的是, OSX 上的行為與 BSD 不同,並且確實會在跳過的檔案cp
上傳回非 0 狀態。-n
$ cp -n foo/* bar/