複製目錄,但如果目標檔案已存在則失敗

複製目錄,但如果目標檔案已存在則失敗

cp -a foo/* bar/會將 foo 的內容複製到 bar 中,取代任何已存在的檔案。我可以使用 -n 標誌來cp不覆蓋現有文件或-i使其以互動方式詢問是否覆蓋文件。

問題

  • cp如果文件已經存在,有沒有辦法讓失敗並傳回錯誤代碼?
  • 如果沒有,是否可以使用rsync其他常用工具?

答案1

Linux

如果檔案存在於 Linux 上,則透過 GNU 的輕微修改可能會失敗nohupnohup重定向/dev/nullstdin,因此任何互動式提示都會被忽略,但將使用stdin視為失敗。

$ nohup cp -ia foo/* bar/

清理一下:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • 預設重新nohup導向stdoutnohup.outstderrstdout
  • 2>nohup.out也放入stderr文件中。
  • && rm || cat在成功時清除或nohup.out在錯誤時輸出錯誤。您可以添加任何您想要的錯誤處理,而不是/包括或刪除所有這些並正常cat處理。$?
  • 如果您認真使用它,您將需要對臨時檔案位置更加了解 ( mktemp -d)

BSD

在 BSD 上,您可以重新導向stdincp將被視為n並傳回非 0 狀態的位置。

$ cp -ia foo/* bar/ </dev/null

作業系統X

令人驚訝的是, OSX 上的行為與 BSD 不同,並且確實會在跳過的檔案cp上傳回非 0 狀態。-n

$ cp -n foo/* bar/

相關內容