mv: "파일이 존재합니다"를 이동할 수 없습니다.

mv: "파일이 존재합니다"를 이동할 수 없습니다.

오류: 일부 폴더를 이동하려고 할 때 "이미 존재하는 파일을 이동할 수 없습니다"

export BACKUP_DIR=/backup
mv -f $BACKUP_DIR/scripts $BACKUP_DIR/scripts_old

에러 발생됨:

mv: cannot move '/backup/scripts' to '/backup/scripts_old/scripts': File exists

해당 옵션을 사용해 보았지만 -f옵션 없이 사용해도 마찬가지였습니다. 동일한 오류가 발생했습니다. 이거 어떻게 옮길 수 있나요?

감사해요!

답변1

기존 디렉터리를 와 결합할 수 없습니다 mv. scripts이 오류 메시지는 /backup/scripts_old.

하지만 할 수 있는 일은 파일을 복사/링크한 다음 소스에서 링크된 파일을 제거하는 것입니다. 여기의 솔루션에는 GNU(비 POSIX)가 필요하며 cp소스와 대상이 동일한 파일 시스템에 있는 경우에만 작동합니다.

BACKUP_DIR=/backup
cp -al "$BACKUP_DIR"/scripts/. "$BACKUP_DIR"/scripts_old/scripts
find "$BACKUP_DIR"/scripts -type f -links 2 -print

노트

  • .소스의 후행점 복사( )필수적이다
  • -print만족스러운 경우 로 변경하면 -delete소스에서 올바른 파일이 제거됩니다.
  • 변수를 사용할 때 큰따옴표를 사용하십시오(그렇지 않으면 이름에 공백이 있는 디렉토리는 코드를 심각하게 손상시킵니다).
  • cpGNU가 복사본 대신 링크를 생성하는 옵션을 제공하지 않으면 충분합니다 rsync.pax

답변2

mv명령은 매우 위험한 작업이므로 디렉터리 교체를 지원하지 않습니다. 실수로 이 작업을 수행하면 대상 디렉터리의 모든 데이터가 손실됩니다.

두 폴더를 병합하지 않으려면 $BACKUP_DIR/scripts_old/scriptsmv를 시도하기 전에 대상 폴더의 이름을 바꾸거나 삭제해야 합니다. 이 문제를 해결할 방법이 없습니다.

옵션은 다음과 같습니다.

  • 먼저 대상 디렉터리를 삭제하세요.
  • 소스 디렉터리를 대상 디렉터리에 넣습니다.$BACKUP_DIR/scripts_old/scripts/scripts
  • 소스 또는 대상 디렉토리의 이름을 바꾸십시오.$BACKUP_DIR/scripts_old/scripts1
  • 디렉터리 병합(그러나 이로 인해 파일을 덮어쓰거나 추가 디렉터리 충돌이 발생할 수 있음) mv scripts/* $BACKUP_DIR/scripts_old/scripts/*(또는 다른 답변에서 찾기와 유사한 작업 수행)
  • rsync와 같은 도구를 사용하여 대상 디렉터리의 파일을 원본 디렉터리의 파일로 바꾸고, 선택적으로 원본 디렉터리를 삭제하거나 원본 디렉터리 대신 대상 디렉터리의 내용을 삭제합니다(아마도 가장 느린 옵션)

그러한 백업 디렉토리가 필요한 이유를 실제로 설명하지 않습니다. 어쩌면 백업 디렉터리를 전혀 사용하지 않고 git과 같은 버전 제어 도구를 사용하는 것이 더 나을 수도 있습니다.

답변3

개별적으로 삭제하지 않고서는 이 작업을 수행할 수 없다고 생각합니다.

rsync a) 소스 파일(파일만) 삭제 --remove-source-files및 b) 소스에 존재하지 않는 대상 파일 삭제( --delete)를 허용합니다. -nv자세한 연습을 위해 함께 사용하는 것이 가장 좋습니다 . 버전에 따라 rsync순환 -r성이 필요할 수 있습니다.

그럼에도 불구하고 여전히 빈 디렉토리 트리가 남게 되며 source, 에서 언급되지 않은 디렉토리는 source변경되지 않은 상태로 유지됩니다 target.

간단히 말해서 두 가지 명령을 사용하는 가장 간단한 옵션은 다음과 같습니다.

rm "$BACKUP_DIR"/scripts_old &&
mv "$BACKUP_DIR"/scripts "$BACKUP_DIR"/scripts_old

관련 정보