상위 디렉터리로 이동하려는 하위 디렉터리에 수많은 파일과 디렉터리가 있습니다. 대상 디렉터리에 덮어써야 할 일부 파일과 디렉터리가 이미 있습니다. 대상에 존재하는 파일만 변경되지 않은 상태로 유지되어야 합니다. 이걸 강제로 할 수 있나요 mv
? 그것( mv * ..
)은 불평한다
mv: cannot move `xyz' to `../xyz': Directory not empty
내가 무엇을 놓치고 있나요?
답변1
다음 명령을 사용하여 cp -r * ..
대상에 복사한 후 소스를 삭제해야 합니다 rm -rf *
.
"병합" 디렉토리를 사용할 수 없다고 생각합니다 mv
.
답변2
rsync
여기가 더 나은 선택일 수 있습니다. 그것은 간단합니다 rsync -a subdir/ ./
.
내 테스트 트리 형식은 filename
다음과 같습니다 contents
.
./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
달리기 rsync
:
$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3
다음을 제공합니다:
./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
그런 다음 시뮬레이션하려면 mv
소스 디렉터리를 삭제해야 할 수도 있습니다.
$ rm -r subdir/
주다:
./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
이것이 잘못된 경우 원하는 결과를 제공하는 유사한 예를 제공할 수 있습니까(예: 이 답변 상단 근처의 테스트 트리 사용)?
답변3
rsync
매개변수를 통해 복사한 후 소스를 삭제할 수 있습니다 --remove-source-files
.
rsync
매뉴얼 페이지 에서 :
--remove-source-files sender removes synchronized files (non-dir)
답변4
/path/to/source/root
다음은 아래의 파일을 아래의 해당 경로로 이동하는 스크립트입니다 /path/to/destination/root
.
- 원본과 대상 모두에 디렉터리가 있는 경우 내용이 재귀적으로 이동되고 병합됩니다.
- 파일이나 디렉터리가 소스에는 있지만 대상에는 없으면 이동됩니다.
- 대상에 이미 존재하는 모든 파일이나 디렉터리는 보존됩니다. (특히 병합된 디렉터리는 소스에 그대로 남아 있어 수정이 쉽지 않습니다.)
테스트되지 않은 코드를 조심하세요.
export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' {} \; -o \
-exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
-o -exec sh -c '
if ! [ -e "$dest/$0" ]; then
mv -f "$0" "$dest/$0";
fi
' {} \;