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

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

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

相关内容