it-swarm-ko.tech

mv로 대상 파일을 덮어 쓰는 방법은 무엇입니까?

부모 디렉토리로 이동하려는 하위 디렉토리에 많은 파일과 디렉토리가 있습니다. 대상 디렉토리에 덮어 써야 할 파일과 디렉토리가 이미 있습니다. 대상에만있는 파일은 그대로 두어야합니다. mv을 강제로 할 수 있습니까? 그것은 (mv * ..) 불평

mv: cannot move `xyz' to `../xyz': Directory not empty

내가 무엇을 놓치고 있습니까?

175
EricSchaefer

cp -r * .. 명령과 rm -rf * 명령을 사용하여 대상에 복사 한 다음 소스를 삭제해야합니다.

mv를 사용하여 디렉토리를 "병합"할 수 없다고 생각합니다.

128
dogbane

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:parent
./dir/file3:subdir
./dir/file4:dir

이것이 잘못된 경우 원하는 결과와 비슷한 예 (예 :이 답변의 상단 근처에서 테스트 트리 사용)를 제공 할 수 있습니까?

77
Mikel

rsync--remove-source-files 매개 변수. 이것은 원하는 것을 할 수있는 편리한 방법이어야합니다.

로부터 rsync man page :

        --remove-source-files   sender removes synchronized files (non-dir)
52
Mike Chen

cprm을 사용하여이 작업을 수행 할 수 있지만 대량의 데이터를 복사하지 않으면 전송을 피하려고합니다. @mattdm은 그의 주석 에서 이것을 암시했으며 다른 질문에 대한 답변 은 다양한 옵션에 대해 더 완전한 토론을했습니다.

cp -rlf source destination
rm -r source

기본적으로 cp 명령의 -l 옵션은 데이터를 새 파일로 복사하지 않고 파일에 대한 하드 링크를 만듭니다.

24
palswim

다음은 /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
' {} \;

이 스레드는 몇 년 동안 존재했지만 여전히 Google에서 1 위를 차지하므로 다른 방법을 추가하고 싶었습니다. 내가 일반적으로하는 방법 : 하위 디렉토리 내용을 tarball로 압축하고 tarball을 상위 디렉토리로 이동시킨 다음 기본 --overwrite 동작으로 추출하십시오. 이것은 당신이 찾고있는 것을 정확하게 수행합니다. 그런 다음 하위 디렉토리를 제거 할 수 있습니다.

cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz
3
Simon Kraus

저장 공간이 충분하면 다음과 같이 할 수 있습니다.

mv -bfv directory_1/* directory_2/ # all duplicate source files/directories 
                                   # will have ~ appended to them
find -name "*~" -delete            # will recursively find and delete all files 
                                   # with ~ on the end

끝에 ~가있는 중요한 파일이 없는지 확인하십시오. 파일이 있으면 기본값 대신 --suffix=whateveryouwant를 추가 할 수 있습니다.

0
4D3H2