리눅스 어떻게 복사하지만 덮어 쓰지 않습니까?


385

내가 원하는 cp심지어 그들이 복사 된 파일보다 오래된 디렉토리하지만 기존 파일을 덮어 싶지 않아요. 그리고 Crontab Bash 스크립트의 일부이므로 완전히 비 대화식으로 만들고 싶습니다. 어떤 아이디어?


답변:


589

매뉴얼 페이지 에서 가져온 것 :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

예:

cp -n myoldfile.txt mycopiedfile.txt

32
파일이 존재하면 오류와 함께 종료됩니다. 성공으로 종료하려면 cp -n source.txt destination.txt || true
galenandrew

13
cp -n파일이 Ubuntu 12.04에 있으면 @galenandrew 가 오류와 함께 종료되지 않습니다.
aut

@galenandrew 님이 확인했습니다. 감사합니다. 대상에 실행 스크립트를 추가 한 후 프로젝트가 Xcode에서 빌드되지 않았습니다.
Ruiz

@AaronFranke는 그렇게 보입니다.
Boris

93

사용을 고려하십시오 rsync.

rsync -a -v --ignore-existing src dst

의견 rsync -a -v src dst에 따르면 기존 파일을 업데이트하므로 정확하지 않습니다.


7
--ignore-existing기존 파일을 덮어 쓰지 않도록 플래그 를 추가하려고합니다 .
모든 근로자가 필수적

7
완전한 명령 rsync -a -v --ignore-existing <src> <dst>은 실제로 cp -u위 대신 정답 입니다.
Whitebird

이전 복사가 중단되고 잘린 파일 만 복사 된 경우 cp -u가 다시 복사하지는 않지만 --ignore-existing? 아마도 ... 아닙니다. 그래서 그것들이 완벽하게 동등 해집니다.
dagelf

CP는 (내 경험) 현재 시간을 사용하는 반면 rsync를 파일 타임 스탬프를 유지합니다
스테판라고 알아요에게

1
일부 서버에는 rsync가 없습니다.
mebada

51
cp -n

당신이 원하는 것입니다. 매뉴얼 페이지를 참조하십시오.


@AaronFranke 예, 재귀 적으로 작동합니다.
보리스

33

이것은 RedHat에서 작동합니다.

false | cp -i source destination 2>/dev/null

업데이트덮어 쓰기를하지 않는 것은 뭔가 다르다.


4
무엇 않습니다 false여기합니까?
Frozen Flame

11
@FrozenFlame -i질문에 답변 합니다.
17시

분명히 ARG_MAX 파일보다 많은 파일을 복사하려고하면이 명령이 작동하지 않습니다. 이 문제를 해결하려면이 링크를 확인 하십시오 .
mginius

2
또한 지구가 태양에 충돌하면이 명령이 작동하지 않습니다.
ceving

32

'n'옵션 (RedHat에서 나와 같은)이 cp -u없는 사람들은 소스가 기존 파일보다 최신이거나 기존 파일이없는 경우에만 파일을 작성하는 데 사용할 수 있습니다 .

주석에서 언급했듯이 이것은 오래된 파일을 덮어 쓰므로 OP가 원하는 것이 아닙니다. ceving의 대답을 사용하십시오.


11
OP는 기존 파일 이 복사 된 파일보다 오래된 경우에도 기존 파일을 덮어 쓰지 말 것을 요청 했기 때문에 -u실제로 목적에 맞지 않습니다.
앤드류 로트

4
맙소사, 당신은 절대적으로 옳습니다. 누군가가 알아 차리는데 너무 오래 걸린다는 것에 놀랐습니다.
잔인한 ...

OP가 요청한 것이 아닐 수도 있지만 정확히 Uberspace (Centos 7)에 필요한 것입니다. 감사!
Thomas Praxl

나는 6 년 전에 내가 도울 수있어서 기쁘다 :-D
그림 ...

10

알파인 리눅스 : 고산 지역 : 대답 다음은 단일 파일의 경우입니다 cp -n(그리고 작동하지 않는 false | cp -i ...솔루션은 I가 발견 내 경우에는 작업 때문에 너무) :

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

위 예제에서 env.js파일이 존재하지 않으면에 복사 env.example.js합니다 env.js.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.