Linux에서 파일 이동, 대상의 기존 디렉토리 추가


1

따라서 내가 가지고 있다고 가정 해 봅시다.

dest/dir/file1
dest/dir/file2
dest/dir/subdir/subfile1
dest/dir/subdir/subfile2

src/dir/file3
src/dir/subdir/subfile3
src/dir/newdir/anotherfile

... 수천 개의 파일과 하위 디렉토리가 있다고 가정 해 봅시다.

이제 모든 새 파일을 src에서 dest, 해당 디렉토리로 이동하여 필요할 때 새 하위 디렉토리를 만들고 싶습니다. 이것은 " cp -a src / dir dest / "와 동일하지만 이동 조작입니다. 디렉토리가 대상에 이미 있으므로 " mv src / dir dest / " 명령 이 실패합니다.

하나의 명령으로 어떻게 할 수 있습니까?


이 있으면 사본 src/dir/file1에 덮어 dest쓰시겠습니까? 아니면 거기에 오래된 사본을 보존?
nik

@nik :이 시나리오에서는 존재하지 않기 때문에 중요하지 않습니다. dest / dir / file1과 src / dir / file1을 모두 유지하는 것이 mv가하는 일을 모방 한 것이기 때문에 최선의 선택 일 것입니다.
Ilari Kajaste

답변:


6

rsync를 사용할 수 있습니다.

rsync -av --remove-source-files src/ dest/

불행히도 디렉토리는 제거되지 않습니다. 추가 명령을 추가하여 제거 할 수 있습니다.


디렉토리를 제거 할 수있는 옵션이 없다는 것이 이상합니다. 어쨌든 이것은 의도에 매우 가깝습니다. 디렉토리 트리의 모든 디렉토리에 명령이 있습니까 (비어있는 경우 전체 트리를 효과적으로 제거)?
Ilari Kajaste

4
당신이 찾을 수있을 것 같아요. -타입 d-빈 -exec rmdir {} \;
Dan Gravell

1
이것이 작동하는 동안 더 효율적인 mv 작업보다는 복사 / 삭제를 수행한다고 생각합니다.
starfry

2

그동안 에 rsync 옵션은 단순히 이동 파일에 대한 더 나은, 여기에 또 다른 접근 방법이다; find 를 사용하여 mv 를 반복적으로 호출하십시오 .

# First, move directories that don't exist on the destination:
(cd src/dir ; find * -type d -print) | while read f; do
   [ ! -d "src/dir/$f" ] || [ -d "dest/dir/$f" ] || mv "src/dir/$f" "dest/dir/$f"
done
# Then move individual files:
(cd src/dir ; find * -type f -print0) | xargs -0 -n1 -i@ /bin/mv src/dir/@ dest/dir/@

# Alternate to the xargs usage, to allow prompting before overwriting files:
(cd src/dir ; find * -type f) | while read f; do
    /bin/mv -i "src/dir/$f" "dest/dir/$f" </dev/tty
done

참고 :

  • _find * 는 점 ( ".")으로 시작하는 파일 / 디렉토리를 건너 뜁니다.
  • 디렉토리도 제거되지 않습니다.

매일 밤 cron 으로이 라인을 따라 무언가를 사용하여 개인 사진 보관소에 새 이미지의 축소판을 만든 다음 rsync 를 사용 하여 두 번째 컴퓨터의 모든 이미지를 백업합니다.


1

cp -a가 아니며 -a 스위치는 아카이브 스위치입니다.

재귀 스위치 인 cp -R이어야합니다.

덮어 쓰기를 강제로 -f 스위치를 추가 할 수도 있습니다.


예. 그러나 -A는 그렇지 않지만 이동은 파일 소유권과 타임 스탬프를 유지합니다. 따라서 -a는 이동에 대한 더 나은 유추입니다.
Ilari Kajaste

0

내가 아는 한 재귀 mv는 불가능합니다. 나는 수행 제안 cp -Ra로 다음 rm -r.


그러나 디렉토리 트리를 한 볼륨에서 다른 볼륨으로 이동할 때 실제로 mv는 재귀 이동을 수행하지 않습니까?
Ilari Kajaste

1
불행히도. mv가 다른 볼륨에서 작동하면 실제로는 cp 다음에 rm이 수행됩니다.
mouviciel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.