Ubuntu

cp 命令在不同的 Ubuntu 版本上進行額外的複制以進行文件夾複製

  • January 9, 2019

編輯:找到一個重複的解決方案: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是文件,它將destsource.

如果要刪除任何現有的目標目錄,可以更改(cp -rf $cmdline $cmdline$i; ) &(rm -rf $cmdline$i && cp -rf $cmdline $cmdline$i; ) &.

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