编辑:找到重复的解决方案:rsync -a --delete https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside
有效的新脚本:
#!/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
到(不存在的)目的地,$cmdline$i
在我的电脑上没有问题乌班图16.04但是当我在云计算机上运行相同的脚本时乌班图18.04,它这样做:
- 将源复制为目标(我只需要这个)
- 也将源复制到目的地(
destination/source
我不想要这个)
这不会破坏任何程序,但我不想消耗不必要的云空间。
为什么某些不同版本的 Ubuntu 会在目标文件夹中添加辅助副本?
我使用这个脚本作为
./myscript.sh 2 foldertest
这会将foldertest 复制为foldertest1 和foldertest2。如果第一个参数是 32,那么它会制作 32 个副本,最多到foldertest32。
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
通常,当我将文件复制到文件时,它会覆盖(如果存在)。我需要对文件夹进行相同的覆盖行为,而不是复制到。
答案1
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; ) &
.