2013-07-12 4 views
1

이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법을 알고 싶습니다. 사용 가능한 -n 스위치가 없습니다.BASH : 이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법

cp -u와 rsync 모두 내가 알고있는 한 이전 파일을 덮어 쓰며이 동작을 원하지 않습니다. 이전 파일은 항상 보관하고 싶습니다.

감사

+0

옵션 인 경우 약간의 스크립트를 작성하여이를 수행 할 수 있습니다. 그것이 내가하는 일의 바람직한 방법입니다. 그렇게하면 행동과 관련하여 100 % 맞춤 설정을 할 수 있습니다. –

+0

-b 옵션을 사용할 수 있습니까? – dougEfresh

+0

@RussellUhl, 스크립트를 작성할 때 TOCTOU의 위험을 조심하십시오. –

답변

3
당신은 덮어 쓰기 전에 메시지를 표시하고 기본값을 채우기 위해 ( GNU coreutils 6.12에서 내 cp 존재)은 " --interactive"옵션을 사용할 수 있습니다

이 아닌 대화 형

echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt 
+0

질문은 "파일"이라고 말하지만, 당신 말이 맞습니다 : 예 예는 좀 더 일반적인 해결책입니다. –

+0

nono .. 에코 'n'은 여기에서 +1입니다. 내 실패 – hek2mgl

+0

'cp -ir a/* b /'(복수 질문)을 사용하더라도'echo 'n'|'는 괜찮습니다. (테스트를 거쳤습니다) 나는 echo 'n'이 첫 번째 질문 만 억제 할 것이라고 예상했을 것입니다 ... 이것을 조사해야합니다 ... – hek2mgl

-3

접근. 파일이 있는지 여부를 확인합니다 (임의 번호의 초기 추가 후). 그럴 경우 다른 난수를 찾습니다. 이것은 다른 방법으로 재생성 할 수 있습니다. 인수를 추가 할 수 있습니다.

copyfile() { 
     n=$RANDOM 
     while [ -f $1__$n ]  
     do 
     n=$RANDOM 
     done 
     cp $1 $1__$n 
    } 

는 사용 :

copyfile file_to_copy 

파일 이름이 지정됩니다 뭔가를해야만 같은 :

Originalfile.txt_20625

첨부 된 번호가 가장 가능성이 덮어 쓰기의 기회를 방지 할 수 있습니다. 이것이 충분하지 않으면 시간 스탬프와 같이 파일 끝에 원하는 것을 추가 할 수 있습니다. 이러한 조치 후에도 덮어 쓰기가 걱정된다면 파일을 정기적으로 백업해야합니다.

+0

문자를 삭제 하시겠습니까? Jim은 제거하려고하지 않고 복사합니다. – dougEfresh

+0

왜 downvotes? 파일을 복사합니다. 이 사이트는 우습다. –

+1

@BobBlogge, 질문을주의 깊게 읽었습니까? 'file_copy'가 이미 존재한다면, 당신의 예제를 사용하면 덮어 씌어 질 것입니다. –

1

동일한 디렉토리에 새로 생성 된 임시 파일에 파일을 복사하십시오 (Linux의 경우 mktemp 또는 tempfile 참조). 그런 다음 ln을 사용하여 복사본에 원하는 이름을 지정하십시오. 이름이 존재하면 ln이 실패합니다. 다른 이름을 사용하거나 오류 메시지를 보내거나 다른 것을 시도 할 수 있습니다. 마지막으로 임시 이름을 제거하십시오.

+0

죄송합니다. 파일을 복사하지 않으려합니다 (크기는 큽니다). 고마워요. –

+0

@JimMoyle : 위의 작업을 수행하기 전에 파일이 존재하는지 테스트하십시오. 때때로, 당신은 무의미한 복사본으로 끝날 것이지만 위에 요약 된 원자 복사본은 최소한 데이터 경합을 막을 것입니다. – rici

관련 문제