编辑:找到一个重复的解决方案:rsync -a --delete /sf/ask/1658872841/里面
有效的新脚本:
#!/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
Run Code Online (Sandbox Code Playgroud)
对于多线程文件夹复制,
#!/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
Run Code Online (Sandbox Code Playgroud)
这个脚本将一个源文件夹复制$cmdline
到(不存在的)目的地$cmdline$i
,在我的Ubuntu 16.04 的电脑上没有问题,但是当我在带有Ubuntu 18.04的云计算机上运行相同的脚本时,它会这样做:
destination/source
我不想要这个)这不会破坏任何程序,但我不想消耗不必要的云空间。
为什么某些不同版本的 Ubuntu 会在目标文件夹中添加辅助副本?
我正在使用这个脚本作为
./myscript.sh 2 foldertest
Run Code Online (Sandbox Code Playgroud)
这将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
Run Code Online (Sandbox Code Playgroud)
但它是:
a.txt
b.txt
c.txt
A
Run Code Online (Sandbox Code Playgroud)
通常当我将文件复制到文件时,它会覆盖(如果存在)。我需要对文件夹具有相同的覆盖行为,而不是复制到。
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; ) &
.