편집: 중복 솔루션 발견: 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
생성됩니다 . 파일이 포함되어 있다고 가정하면 파일이 생성됩니다 .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; ) &
.