Cp 命令在不同的 Ubuntu 版本上进行额外的复制以进行文件夹克隆

hus*_*sik 3 ubuntu cp

编辑:找到一个重复的解决方案: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)

通常当我将文件复制到文件时,它会覆盖(如果存在)。我需要对文件夹具有相同的覆盖行为,而不是复制到。

Bod*_*odo 6

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; ) &.