엄청난 수의 파일이 있는 폴더에서 파일을 복사/tar하는 방법은 무엇입니까?

엄청난 수의 파일이 있는 폴더에서 파일을 복사/tar하는 방법은 무엇입니까?

그래서 나는 조금 어리석은 실수를 저질렀습니다. 소스에서 데이터를 수집하는 동안 모든 것을 외부 디스크의 루트에 덤프했습니다. 현재 이 디스크에는 약 600,000개 이상의 파일(총 23GB)이 있습니다. 제가 하고 싶은 몇 가지 옵션은 다음과 같습니다.

  1. 특정 수의 파일을 디스크에서 내 하드 디스크로 이동합니다.
  2. 하위 폴더(각 하위 폴더에 1000개의 파일 포함)를 만들고 그 사이에 파일을 배포합니다.
  3. 전체 또는 일부(예: 50,000개의 파일)를 tar하고 내 디스크로 옮깁니다.

하지만 무엇을 하려고 해도 시간이 오래 걸리는 것 같아요. 누군가 이 작업을 수행하는 최적의/가장 효율적인 방법에 대해 도움을 줄 수 있습니까? 감사해요.

답변1

다음은 이라는 하위 디렉터리를 만든 new다음 ..라는 이름으로 번호가 매겨진 50개의 하위 디렉터리 를 new만듭니다 . 그런 다음 현재 디렉터리에서 각 디렉터리로 최대 1000개의 파일을 이동합니다 .new/01new/50new/*

참고 1: 다음 중 하나라도 해당되면 작동하지 않습니다.파일 이름\n그 안에 개행 문자( )가 있습니다 .

참고 2: 이를 위해서는 GNU xargs및 GNU가 필요합니다 mv. Linux를 실행 중이므로 이것이 표준입니다.

필요에 맞게 숫자(50 및 1000)와 기본 디렉터리를 변경할 수 있습니다.

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

이동하려는 파일이 모두 특정 패턴과 일치하는 경우 찾기 -name또는 -regex옵션을 사용하여 선택할 수 있습니다. 바로 뒤에 옵션을 추가하십시오 -type f. 예를 들어 파일만 이동하려는 경우 .txt:

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

GNU가 아닌 버전에서는 mv -t. 또한 옵션을 사용할 수 없지만 줄 바꿈을 NUL 문자로 변환하여 공급할 xargs -d수 있습니다 . 이는 파일 이름에 이 없는 모든 파일에 대처합니다 . 에 대한 freebsd 확장인 non-posix인 경우 해당 옵션을 안전하게 제거할 수 있지만 작업이 훨씬 느리게 실행됩니다.tr '\n' '\0'xargs -0r\n-R -1xargsmv

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done

관련 정보