이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법을 알고 싶습니다. 사용 가능한 -n 스위치가 없습니다.BASH : 이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법
cp -u와 rsync 모두 내가 알고있는 한 이전 파일을 덮어 쓰며이 동작을 원하지 않습니다. 이전 파일은 항상 보관하고 싶습니다.
감사
이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법을 알고 싶습니다. 사용 가능한 -n 스위치가 없습니다.BASH : 이전 파일을 덮어 쓰지 않고 파일을 복사하는 방법
cp -u와 rsync 모두 내가 알고있는 한 이전 파일을 덮어 쓰며이 동작을 원하지 않습니다. 이전 파일은 항상 보관하고 싶습니다.
감사
GNU coreutils 6.12
에서 내
cp
존재)은 "
--interactive
"옵션을 사용할 수 있습니다
이 아닌 대화 형
echo 'n' | cp --interactive ~/somefile.txt ~/somefile_already_exists.txt
접근. 파일이 있는지 여부를 확인합니다 (임의 번호의 초기 추가 후). 그럴 경우 다른 난수를 찾습니다. 이것은 다른 방법으로 재생성 할 수 있습니다. 인수를 추가 할 수 있습니다.
copyfile() {
n=$RANDOM
while [ -f $1__$n ]
do
n=$RANDOM
done
cp $1 $1__$n
}
는 사용 :
copyfile file_to_copy
파일 이름이 지정됩니다 뭔가를해야만 같은 :
Originalfile.txt_20625
첨부 된 번호가 가장 가능성이 덮어 쓰기의 기회를 방지 할 수 있습니다. 이것이 충분하지 않으면 시간 스탬프와 같이 파일 끝에 원하는 것을 추가 할 수 있습니다. 이러한 조치 후에도 덮어 쓰기가 걱정된다면 파일을 정기적으로 백업해야합니다.
문자를 삭제 하시겠습니까? Jim은 제거하려고하지 않고 복사합니다. – dougEfresh
왜 downvotes? 파일을 복사합니다. 이 사이트는 우습다. –
@BobBlogge, 질문을주의 깊게 읽었습니까? 'file_copy'가 이미 존재한다면, 당신의 예제를 사용하면 덮어 씌어 질 것입니다. –
동일한 디렉토리에 새로 생성 된 임시 파일에 파일을 복사하십시오 (Linux의 경우 mktemp
또는 tempfile
참조). 그런 다음 ln
을 사용하여 복사본에 원하는 이름을 지정하십시오. 이름이 존재하면 ln
이 실패합니다. 다른 이름을 사용하거나 오류 메시지를 보내거나 다른 것을 시도 할 수 있습니다. 마지막으로 임시 이름을 제거하십시오.
죄송합니다. 파일을 복사하지 않으려합니다 (크기는 큽니다). 고마워요. –
@JimMoyle : 위의 작업을 수행하기 전에 파일이 존재하는지 테스트하십시오. 때때로, 당신은 무의미한 복사본으로 끝날 것이지만 위에 요약 된 원자 복사본은 최소한 데이터 경합을 막을 것입니다. – rici
옵션 인 경우 약간의 스크립트를 작성하여이를 수행 할 수 있습니다. 그것이 내가하는 일의 바람직한 방법입니다. 그렇게하면 행동과 관련하여 100 % 맞춤 설정을 할 수 있습니다. –
-b 옵션을 사용할 수 있습니까? – dougEfresh
@RussellUhl, 스크립트를 작성할 때 TOCTOU의 위험을 조심하십시오. –