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

이렇게 하면 폴더테스트가 폴더테스트1과 폴더테스트2로 복사됩니다. 첫 번째 인수가 32이면 최대foldertest32까지 32개의 복사본을 만듭니다.

cp에 대한 문서에 -r은 재귀 복사를 위한 것이라고 나와 있습니다. 이는 Windows 또는 Ubuntu 그래픽 터미널에서 복사하여 붙여넣는 것과 마찬가지로 소스 폴더의 전체 완전 ​​복제를 수행하는 데 필요한 것입니다(폴더2, 폴더3 생성... 장소). 또한 최대 64개의 클론을 생성하고 이미 64개의 클론이 있는 경우 64개의 질문에 대답하고 싶지 않기 때문에 묻지 않고 파일을 강제로 복사하도록 -f를 추가했습니다.

필요한 동작에 대한 추가 정보는 다음과 같습니다.

폴더 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생성됩니다 . 파일이 포함되어 있다고 가정하면 파일이 생성됩니다 .sourcedestsourcef1dest/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; ) &.

관련 정보