하위 디렉터리(및 파일)를 상위 디렉터리로 이동하고 덮어쓰는 방법은 무엇입니까?

하위 디렉터리(및 파일)를 상위 디렉터리로 이동하고 덮어쓰는 방법은 무엇입니까?

상위 디렉터리로 이동하려는 하위 디렉터리에 수많은 파일과 디렉터리가 있습니다. 대상 디렉터리에 덮어써야 할 일부 파일과 디렉터리가 이미 있습니다. 대상에 존재하는 파일만 변경되지 않은 상태로 유지되어야 합니다. 이걸 강제로 할 수 있나요 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
' {} \;

관련 정보