그래서 저는 작은 실수를 했습니다. 소스에서 데이터를 수집하는 과정에서 모든 것을 외부 디스크의 루트에 덤프했는데, 현재 이 루트에는 약 600,000개가 넘는 파일(총 23GB)이 저장되어 있습니다. 내가 하고 싶은 작업에 대한 몇 가지 옵션은 다음과 같습니다.
- 특정 수의 파일을 디스크에서 하드 드라이브로 이동합니다.
- 하위 폴더(각각 1000개의 파일 포함)를 만들고 폴더 사이에 파일을 배포합니다.
- 전체 파일 또는 파일의 일부(예: 50,000개 파일)를 압축하여 내 디스크로 이동합니다.
하지만 아무리 노력해도 영원히 걸릴 것 같습니다. 누구든지 이러한 작업을 수행하는 가장 효과적인/가장 효율적인 방법을 이해하도록 도와줄 수 있습니까? 감사해요.
답변1
다음은 이름이 지정된 하위 디렉터리를 만든 new
다음 ..라는 번호가 붙은 50개의 new
하위 디렉터리를 만듭니다. 그런 다음 현재 디렉터리에서 각 디렉터리로 최대 1000개의 파일을 이동합니다.new/01
new/50
new/*
참고 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 -1
xargs
mv
#! /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