编辑:找到一个重复的解决方案: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
到(不存在的)目标文件夹中,$cmdline$i
而在Ubuntu 16.04的电脑上没有问题,但是当我在使用Ubuntu 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
通常,当我将文件复制到文件时,它会覆盖(如果存在)。我需要在文件夹上执行相同的覆盖行为,而不是复制到其中。
的结果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; ) &
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句