Cp

如何使用cp以冪等方式遞歸複製文件夾?

  • September 22, 2015

當我使用

cp -R inputFolder outputFolder

結果取決於上下文

  1. 如果outputFolder不存在,則創建,複製的文件夾路徑為outputFolder.
  2. 如果outputFolder存在,則創建的複製將是outputFolder/inputFolder

這太可怕了,因為我想創建一些安裝腳本,如果使用者錯誤地執行了兩次,他將outputFolder第一次創建,然後在第二次執行時,所有的東西都會在outputFolder/inputFolder.

  • 我總是想要第一個行為:在原件旁邊創建一個複製(作為兄弟)。
  • 我想用來cp便攜(例如MINGW沒有rsync發貨)
  • 我檢查cp -R --parents過,但這會在目錄樹上重新創建路徑(所以複製不會是outputFolderbut some/path/outputFolder
  • --remove-destination或者--update如果 2 沒有改變任何東西,仍然會被複製到outputFolder/inputFolder

有沒有辦法在不首先檢查是否存在outputFolder(如果文件夾不存在則……)或使用的情況下做到這一點rm -rf outputFolder

達成共識的可移植 UNIX 方式是什麼?

改用這個:

cp -R inputFolder/. outputFolder

這與工作方式完全相同cp -R aaa/bbb ccc:如果ccc不存在,則將其創建為bbb及其內容的副本;但如果ccc已經存在,則創建為其及其內容ccc/bbb的副本。bbb

對於幾乎任何bbb這種情況,都會產生您在問題中提到的不良行為。但是,在這種特定情況下,bbbis just ., so aaa/bbbis really aaa/.,這反過來又是真的只是,aaa但有另一個名字。所以我們有這兩種情況:

  1. ccc不存在:

該命令的cp -R aaa/. ccc意思是“創建ccc並複制aaa/.into的內容ccc/.,即復製aaaccc. 2. ccc確實存在:

該命令的cp -R aaa/. ccc意思是“複製aaa/.into的內容ccc/.,即復製aaaccc.

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