cp 命令在不同的 Ubuntu 版本上進行額外的複制以進行文件夾複製
編輯:找到一個重複的解決方案:rsync -a –delete https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-裡面
有效的新腳本:
#!/bin/bash numCopy=$1 shift cmdline="${@}" echo "prepare folders" for ((i=1;i<=$numCopy;i++)); do (rsync -a --delete $cmdline/ $cmdline$i/; ) & (echo "preparing folder clone: $i") & done wait
對於多執行緒文件夾複製,
#!/bin/bash numCopy=$1 shift cmdline="${@}" echo "prepare folders" for ((i=1;i<=$numCopy;i++)); do (cp -rf $cmdline $cmdline$i; ) & (echo "preparing folder clone: $i") & done wait
此腳本將源文件夾複製
$cmdline
到(不存在的)目的地,在我的Ubuntu 16.04$cmdline$i
的電腦上沒有問題,但是當我在Ubuntu 18.04的雲電腦上執行相同的腳本時,它會這樣做:
- 將源複製為目標(我只需要這個)
- 也將源複製到目的地(
destination/source
我不想要這個)這不會破壞任何程序,但我不想消耗不必要的雲空間。
為什麼某些不同版本的 Ubuntu 會將輔助副本添加到目標文件夾中?
我使用這個腳本作為
./myscript.sh 2 foldertest
這將 foldertest 複製為 foldertest1 和 foldertest2。如果第一個參數是 32,那麼它會複製 32 個副本到文件夾 test32。
cp 的文件說 -r 是遞歸複製,我需要對源文件夾進行完整的深度複製,就像在 Windows 或 Ubuntu 的圖形終端中複製粘貼(就地生成 folder2 folder3 …)一樣。此外,我添加 -f 以強制它複製文件而不詢問,因為我最多製作 64 個複製,並且如果已經有 64 個複製,我不想回答 64 個問題。
關於我需要的行為的一些額外資訊:
文件夾 A:a.txt b.txt c.txt
文件夾 A1,A2,A3,A4.. 為:
a.txt b.txt c.txt
但它是:
a.txt b.txt c.txt A
通常當我將文件複製到文件時,它會覆蓋(如果存在)。我需要對文件夾進行相同的覆蓋行為,而不是複製到其中。
如果已經存在,結果
cp -rf source dest
會有所不同。dest
- 如果
dest
不存在,它將創建一個source
名為的副本dest
。假設source
包含一個文件f1
,它將創建dest/f1
.- 如果
dest
作為目錄存在並且如果dest
不包含名為 的文件source
,則它將source
其所有內容複製到dest
. 通過上面的範例,您將獲得dest/source/f1
.- 如果
dest
作為文件存在並且如果source
是目錄,則複製將失敗。- 如果
dest
作為目錄存在並且如果dest
包含名為 的文件source
,則複製將失敗。- 如果
dest
作為文件存在並且如果source
是文件,它將dest
被source
.如果要刪除任何現有的目標目錄,可以更改
(cp -rf $cmdline $cmdline$i; ) &
為(rm -rf $cmdline$i && cp -rf $cmdline $cmdline$i; ) &
.