Linux에서 한 디렉토리에서 다른 디렉토리로 백만 개의 이미지를 이동하는 가장 빠른 방법은 무엇입니까?


14

하나의 로컬 디렉토리에서 다른 로컬 디렉토리로 이동 해야하는 30GB의 디스크 공간을 차지하는 백만 개의 이미지가 있습니다.

가장 효율적인 방법은 무엇입니까? 사용 mv? 사용 cp? 사용 rsync? 다른 것?

나는 이것을 가져 가야합니다.

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

여기로 옮기십시오.

/path/to/new/img/dir/

5
mv소스 및 대상 디렉토리가 동일한 파일 시스템에있는 경우 성능 측면에서 이길 수 있다고 생각하지 않습니다 .
Frédéric Hamidi

답변:


26

rsync 로컬 및 원격 시스템을 설명하는 많은 클라이언트 / 서버 백그라운드 작업을 수행하기 때문에 좋지 않은 선택입니다.

mv아마도 최선의 선택 일 것입니다. 가능하면 mv directory_old directory_new대신 시도해야합니다 mv directory_old/* directory_new/. 이런 식으로, 당신은 백만 가지 대신 한 가지를 움직입니다.


6
파일 대신 디렉토리를 이동하도록 조언을 +1하십시오.
Ex Umbris

4
또한 와일드 카드 확장은 mv수백만에 대해 이야기 하는 경우 지원되는 최대 인수를 깰 수 있습니다.
slhck

6
rsync는 로컬 스토리지 미디어에서의 전송을 잘 처리합니다. -전체 파일 (델타 xfer 알고리즘의 구현 제거)과 같은 것을 강제하고 로컬 전송에서 목적을 제공하지 않는 압축과 같은 것을 방지합니다. 디렉토리가 다른 파일 시스템에있는 경우 'mv'는 어떤 종류의 성능도 제공하지 않습니다. 그들이 동일한 파일 시스템에 상주한다면,이 사람들과 같은 디렉토리를 'mv'만으로 말했다.
UtahJarhead

이미지가 많은 경우 간단한 셸 와일드 카드를 사용하면 최대 명령 줄이 오버플로됩니다.
Raúl Salinas-Monteagudo

1
디스크 간을 이동해도 여전히 모든 데이터가 이동합니다. 동일한 디스크에서, mv단지 inode 정보 만 업데이트하므로 mv directory_old directory_new보다 빠르게 작동합니다mv directory_old/* directory_new
Anshul

14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • 이것은 인수 확장을 오버플로하지 않습니다.
  • 원하는 경우 파일 확장자를 지정할 수 있습니다. (-이름 ...)
  • find -print0with xargs -0를 사용하면 이름에 공백을 사용할 수 있습니다.
  • xargs -rmv이동할 것이 없으면 실행 되지 않습니다 . ( mv소스 파일이 제공되지 않으면 불평합니다).
  • 구문을 mv -t사용하면 먼저 필요한 대상을 지정한 다음 소스 파일을 지정할 수 있습니다 xargs.
  • 전체 디렉토리 이동은 포함 된 파일 수에 관계없이 일정한 시간에 수행되기 때문에 물론 훨씬 빠릅니다.
    • 소스 디렉토리가 일정 시간 동안 사라지고 문제가 발생할 수 있습니다.
    • 프로세스가 현재 디렉토리를 출력 디렉토리로 사용하는 경우 (항상 이동하지 않는 위치에서 전체 경로를 참조하는 것과 대조적으로) 디렉토리를 다시 시작해야합니다. ( 로그 회전 과 마찬가지로 ).

그건 그렇고, 실제로 많은 양의 파일을 한 번에 이동 해야하는지 여부를 스스로에게 묻습니다. 일괄 처리가 과대 평가되었습니다. 나는 그것이 생성되는 순간에 물건을 처리 할 수 ​​있다면 엄청난 양의 작업을 축적하려고하지 않습니다.


이것은 동일한 서버의 파일 시스템간에 파일을 이동시키기에 충분합니다. rsync에서 솔루션을 찾지 않아도 충분합니다. 물론 한두 시간이 걸렸지 만 작동합니다. 참고로 "."대신 디렉토리 이름을 찾으면주의해야합니다. -find 명령에 후행 슬래시를 사용해야합니다. 그렇지 않으면 mv 명령의 대상에 디렉토리가 다시 작성됩니다.
Speeddymon

7

두 디렉토리가 동일한 파일 시스템에 있으면 디렉토리 mv의 내용이 아닌 디렉토리에서 사용하십시오.

두 개의 다른 파일 시스템에 상주하는 경우 rsync를 사용하십시오.

rsync -av /source/directory/ /destination

/소스 에서 후행 을 확인하십시오. 이것은 디렉토리 자체가 아닌 디렉토리의 내용을 복사한다는 것을 의미합니다. /꺼져 있으면 파일은 여전히 ​​복사되지만라는 디렉토리에 저장 /destination/directory됩니다. /를 사용하면 파일이/destination

rsync루트로 실행하거나 파일을 소유 한 경우 파일 소유권을 유지합니다. 또한 mtime각각의 개별 파일을 유지 관리 합니다.


2
하나의 하드 드라이브에서 다른 하드 드라이브로 큰 폴더를 복사하는 경우 rsync주위를 돌고있는 것처럼 보입니다 mv. 팁 고마워!
leo-the-manic

2
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

'cp'를 사용하면 각 파일은 open-read-close-open-write-close를 수행합니다. Tar은 한 번에 여러 파일에서 작동하기 위해 여러 트레드뿐만 아니라 읽기 및 쓰기에 다른 프로세스를 사용합니다. 단일 CPU 박스에서도 멀티 스레드 앱이 더 빠릅니다.


2
이것이 질문에 대한 답변이 될 수 있지만, 그 이유를 설명 할 수 있다면 더 나은 답변이 될 것 입니다.
DavidPostill

1
이들이 로컬 머신에있는 경우 동일한 파일 시스템에 상주 할 가능성이 있습니다. 를 사용 tar c | tar x하면 O (file_count) 대신 O (total_size)의 비용이 발생합니다.
Raúl Salinas-Monteagudo

1

directory_old 및 directory_new는 모두 동일한 파일 시스템에 있으므로 옵션 cp -l대신 사용할 수 있습니다 mv. cp -l원본 파일에 대한 하드 링크를 만듭니다. 'move'를 마치고 결과에 만족하면 directory_old에서 이러한 파일을 제거 할 수 있습니다. 속도면에서 링크를 먼저 만든 다음 원래 링크를 제거 할 때 'mv'와 같습니다. 그러나이 방법을 통해 처음부터 시작할 수 있습니다.


0

그것은 (tm)에 달려 있습니다. 파일 시스템이 기록 중 복사 인 경우 복사 ( cp또는 rsync예를 들어)는 이동과 비교할 수 있어야합니다. 그러나 대부분의 경우 이동 ( mv)이 가장 빠릅니다. 파일이있는 위치를 설명하는 데이터 조각을 간단히 전환 할 수 있기 때문입니다 (참고 : 지나치게 단순화 됨).

따라서 일반적인 Linux 설치에서는을 선택 mv합니다.

편집 : @ Frédéric Hamidi는 의견에 좋은 지적이 있습니다. 이것은 동일한 파일 시스템과 디스크에있는 경우에만 유효합니다. 그렇지 않으면 데이터가 어쨌든 복사됩니다.


0

~ 10k 이상의 파일 (디렉토리 없음)을 복사하기 위해 cp는 다음과 같이 불평했습니다.

/ bin / cp를 실행할 수 없습니다 : 인수 목록이 너무 깁니다

가장 좋은 옵션은 Rsync입니다.

rsync 소스 대상

그리고 그것은 매우 빨리 이루어졌습니다!


0

여유 공간이 있으면 파일을 하나의 .tar 파일로 압축 한 후 압축하지 않고 파일을 이동 한 후 보관 해제하십시오.


0

대상의 특성에 따라이 작업을 수행하는 가장 효율적인 방법이 결정됩니다. 하자가 로컬 시스템에있는 가정, 당신은 PWD이다 /지금. 및 /a이미지의 수백만이 포함되어 있습니다. 우리의 임무는 /b모든 하위 디렉토리 구조를 유지하면서 모든 이미지를로 이동하는 것입니다 . 또한 각각 로컬로 연결된 디스크에있는 두 개의 서로 다른 파티션에 대한 마운트 지점을 가정 /a하고 가정 /b합니다. 이 작업을 타 파이프 (tarpipe)로 수행하고 싶습니다. 이 때문에 당신이 사용하고 만들 시간이 걸릴 수 있습니다 screen, tmux또는 당신은 백그라운드 프로세스로이 작업을 실행합니다.

tar -C /a -cf . | tar -C /b -xf -

즉 모든 파일과 디렉토리를 복사합니다 /a/b이제 당신이 청소해야합니다, /a당신이 오류없이 완료 확인 후.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.