많은 수의 파일이 포함된 폴더에서 파일을 복사/압축하는 방법은 무엇입니까?

많은 수의 파일이 포함된 폴더에서 파일을 복사/압축하는 방법은 무엇입니까?

그래서 저는 작은 실수를 했습니다. 소스에서 데이터를 수집하는 과정에서 모든 것을 외부 디스크의 루트에 덤프했는데, 현재 이 루트에는 약 600,000개가 넘는 파일(총 23GB)이 저장되어 있습니다. 내가 하고 싶은 작업에 대한 몇 가지 옵션은 다음과 같습니다.

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

하지만 아무리 노력해도 영원히 걸릴 것 같습니다. 누구든지 이러한 작업을 수행하는 가장 효과적인/가장 효율적인 방법을 이해하도록 도와줄 수 있습니까? 감사해요.

답변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데 사용할 수 있습니다 tr '\n' '\0'. 다시 말하면 xargs -0r파일 이름에 문자가 없는 모든 파일이 처리됩니다. 예 non-posix, 예 freebsd 확장, 이 옵션을 안전하게 제거할 수 있지만 작업 실행 속도가 훨씬 느려집니다.\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

관련 정보