그래서 나는 조금 어리석은 실수를 저질렀습니다. 소스에서 데이터를 수집하는 동안 모든 것을 외부 디스크의 루트에 덤프했습니다. 현재 이 디스크에는 약 600,000개 이상의 파일(총 23GB)이 있습니다. 제가 하고 싶은 몇 가지 옵션은 다음과 같습니다.
- 특정 수의 파일을 디스크에서 내 하드 디스크로 이동합니다.
- 하위 폴더(각 하위 폴더에 1000개의 파일 포함)를 만들고 그 사이에 파일을 배포합니다.
- 전체 또는 일부(예: 50,000개의 파일)를 tar하고 내 디스크로 옮깁니다.
하지만 무엇을 하려고 해도 시간이 오래 걸리는 것 같아요. 누군가 이 작업을 수행하는 최적의/가장 효율적인 방법에 대해 도움을 줄 수 있습니까? 감사해요.
답변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
수 있습니다 . 이는 파일 이름에 이 없는 모든 파일에 대처합니다 . 에 대한 freebsd 확장인 non-posix인 경우 해당 옵션을 안전하게 제거할 수 있지만 작업이 훨씬 느리게 실행됩니다.tr '\n' '\0'
xargs -0r
\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