한 디렉토리로 파일을 안전하게 대량 이동하는 방법은 무엇입니까?


10

디렉토리에 수백 또는 수천 개의 파일이있을 수있는 디렉토리로 파일을 어떻게 이동시킬 수 있습니까 ..? 어떤 방법을 사용 하시겠습니까?

속임수를 처리하는 방법은 다양 할 수 있으며 때로는 덮어 쓰고 때로는 더 안전해야합니다. IO는 프로덕션 서버이므로 중요 할 수 있습니다. 그러나 수량이 주어지면 중복되지 않은 파일에 대한 프롬프트는 옵션이 아닙니다. 권한 및 타임 스탬프 등의 보존이 중요합니다. 우리는 일반적으로 데이터가 무엇인지 알지 못합니다.

아, 그리고 그것을 사용 mv하지 않아도되고 rsync, cp솔루션을 환영합니다.

참고 : CentOS 5.5를 실행하고 있으므로 최신 기능으로 인해 작동하지 않을 경우 알려주십시오.


ypu는 dupes에 대해 무엇을 원하십니까?

@Iain은 상황에 달려 있습니까? 나는 웹 호스트에서 일한다. 그것은 실제로 mv우리가 보존에 관심이 있는지 여부와 우리가 이미 백업했는지에 달려있다. 이 질문은 상당히 개방적입니다. 나는 단지 좋은 옵션을 찾고 있으며 아마도 당신을 물릴 수 있는지 여부와 방법에 대한 의견을 찾고 있습니다.
xenoterracide

나는 손잡이 쉘에 너무 많은 파일이있어 가정 mv * ../이나 mv -i * ../?
Michael Mrozek

@ Michael 나는 그것이 다를 것이라고 확신합니다 ... 어쩌면 그렇지 않을 수도 있습니다. 경우에 따라 내 작업 환경에 가능한 한 많은 옵션을 찾으려고합니다.
xenoterracide

답변:


6

부모의 rsync를 사용하는 것이 좋습니다.

rsync -avPr -b --suffix='-original' child/* .

부모의 모든 기존 중복 파일을 파일 -original로 백업합니다 .


내가 생각하는 -a의미-r
xenoterracide

@xenoterracide - 바로 당신 'R'

@Tok은 사본을 하드 링크로 할 수 있습니까? IO를 낭비하지 않도록. (같은 -l에 대한 cp)
xenoterracide

@xenoterracide- rsync에 대해 -Hor --hard-links플래그를 사용하여 하드 링크를 보존 할 수 있습니다 .
Tok

1
@xenoterracide- --link-dest=DIR플래그를 사용하여 다음과 같이이 동작을 수행 할 수 있습니다. rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/src와 src 사이의 변경되지 않은 파일 (이 경우 모든 파일)에 dst /로 하드 링크됩니다. 일반적으로 데이터를 복사하지 않고 백업 파일을 다시 연결하려는 경우이 플래그가 사용됩니다 --link-dest=/most/recent/backup.
Tok

4
cp -bal . ..

이것은 현재 디렉토리의 모든 것을 그 위의 디렉토리로 복사하고, 모든 권한을 유지하고, 가능한 경우 IO를 최소화하기 위해 하드 링크를 사용하고, 중복시 파일 이름을 만듭니다 ~

그 후

rm -rf . ; cd .. ; rmdir <originaldir>;

아마도 많은 수의 파일 문제가 발생하지만 rsync만큼 IO를 많이 사용하지는 않습니다.
xenoterracide

2

이 예에서는 파일을 '/ parent / old-dir'에서 '/ parent'로 이동합니다.

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

rsync 규칙에 따라 dups는의 최신 파일로 교체됩니다 old-dir.


1

당신은 시도 할 수 있습니다

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

..에서 듀피 파일을 덮어 씁니다.

..의 속임수가 같거나 더 최신 인 경우 mv -u '{}'을 (를) 겹쳐 쓰지 않을 수 있습니다.


왜 파이프가 xargs를 찾습니까? 왜 사용하지 +
xenoterracide

1
@xenoterracide-습관과 이식성 (GNU 확장)입니다. 그 외에도 방금 시도했지만 +가 끝에 추가 되면 두 번째 매개 변수 ..mv '{}' +명령 에 전달하는 방법을 알 수 없습니다 .

@Iain + 는 POSIX 에 있으며 실제로 GNU find가 늦었다 고 들었습니다.
xenoterracide

당신 맞아요하지만 난 아직도 .. 사용하는 방법 알아낼 수 없습니다

2
@xenoterracide : GNU coreutils 사용 : -exec mv -t .. -- {} +. 포터블 : -exec sh -c 'mv -- "$@"' _ {} +.
Gilles 'SO- 악마 그만'12

1

mv -i 대상이 존재하는 경우에만 프롬프트합니다.

yes n | mv -i …대상 디렉토리에 존재하지 않는 모든 파일을 이동합니다. FreeBSD와 OSX에서는 이것을 단축 할 수 있습니다 mv -n ….

이들 중 어느 것도 대상 디렉토리에서 같은 이름의 기존 디렉토리와 디렉토리 인수를 병합하지 않습니다.


별도의 문제는 현재 디렉토리의 모든 파일에 대해 작업하는 방법입니다. 두 가지 문제가 있습니다. 모든 파일을 가져 *오고 ( 도트 파일 생략) 명령 행으로 실행되지 않습니다. Linux (또는보다 일반적으로 GNU find 및 GNU coreutils)에서 :

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

GNU에서 GNU coreutils (또는 이전 GNU coreutils)를 찾지 만 :

find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +

포터블 :

find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune

평소와 같이 zsh를 사용하면 작업이 쉬워집니다. 내부적으로 명령 줄 길이 제한 mv이 없으므로 내장 기능을 사용 하면 걱정할 필요가 없습니다. 또한 Dglob 한정자를 사용하여 도트 파일을 무시하지 않도록 지시 할 수 있습니다 . 제한 사항 : 파일 시스템 전체에서 작동하지 않습니다 (zsh 4.3.10 기준).

zmodload zsh/files
mv -i -- *(D) ..

많은 논쟁에?
xenoterracide

0

나는 ML에 말했다

mv * ..

분명히 이것은 안전하지 않습니다 ... 것들을 덮어 쓸 것입니다. 내가 결코 겪지 않은 한계가있을 수 있습니다.


2
파일 수가 많으면 '인수 목록이 너무 깁니다.'오류가 발생할 수 있습니다.

2
로 시작하는 파일 이름이 있으면 나쁜 일을 할 수 있습니다 -. 이름이로 시작하는 파일은 포착하지 않습니다 ..
Gilles 'SO- 악마 중지

0

다음은 과거에 좋은 효과를 냈던 파이썬 템플릿입니다.

#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil

# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]

for filename in files:
    shutil.move (filename, filename [:23] + ".mp3")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.