Cp

有沒有辦法表達:--link 或回退到 cp 中的普通副本(來自 GNU coreutils)?

  • February 5, 2013

有沒有辦法告訴cp--link即創建硬連結),但在我嘗試設備間硬連結的情況下回退?設備間連結是不可能的,並且會導致cp失敗。

我問的原因是因為我想在 a 中使用它,GNUmakefile並且更喜歡可讀的命令行而不是一些複雜而冗長的命令行(或函式,就此而言)。

問題是針對 GNU coreutils(7.4 和 8.13)。

注意:現在解決方法類似於(GNU make recipe syntax):

cp -fl $^ $@ || cp -f $^ $@

這當然會在設備間連結的情況下給出虛假的錯誤消息,儘管隨後在第二次cp呼叫中成功。此外,然後它會被擴展(畢竟源表單看起來可讀)它不會再太可讀了。

cp沒有這個選項。您可以編寫一個包裝腳本,但這很簡單。

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5 引入了該--reflink選項。如果您通過--reflink=auto並且底層文件系統支持寫時複製(例如 Btrfs 或 ZFS)並且副本恰好在同一設備上,那麼cp將創建一個新的 inode 但不複製內容;否則cp執行正常複製。這仍然不是硬連結(目標始終是不同的 inode),但它可能對您的案例更好。但是,如果您使用的是不支持寫時複製的 ext4(就像現在的大多數人一樣),那麼這對您沒有幫助。

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