오류: 일부 폴더를 이동하려고 할 때 "이미 존재하는 파일을 이동할 수 없습니다"
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
소스에서 올바른 파일이 제거됩니다.- 변수를 사용할 때 큰따옴표를 사용하십시오(그렇지 않으면 이름에 공백이 있는 디렉토리는 코드를 심각하게 손상시킵니다).
cp
GNU가 복사본 대신 링크를 생성하는 옵션을 제공하지 않으면 충분합니다rsync
.pax
답변2
이 mv
명령은 매우 위험한 작업이므로 디렉터리 교체를 지원하지 않습니다. 실수로 이 작업을 수행하면 대상 디렉터리의 모든 데이터가 손실됩니다.
두 폴더를 병합하지 않으려면 $BACKUP_DIR/scripts_old/scripts
mv를 시도하기 전에 대상 폴더의 이름을 바꾸거나 삭제해야 합니다. 이 문제를 해결할 방법이 없습니다.
옵션은 다음과 같습니다.
- 먼저 대상 디렉터리를 삭제하세요.
- 소스 디렉터리를 대상 디렉터리에 넣습니다.
$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