
내가 달성하려는 것은 176,000개의 파일이 있는 디렉토리를 갖는 것입니다. 스크립트에서 176,000개의 파일을 각각 20,000개의 파일이 포함된 폴더로 분할하고 마지막 폴더에는 이상한 공 #이 포함되도록 하려고 합니다. 파일을 순차적으로 복사하여 영숫자순으로 저장하고 싶습니다. 이것이 제가 현재 가지고 있는 것이지만 뭔가 누락된 것 같습니다. 생성된 처음 2개의 폴더는 순서가 잘못되어 있고 생성된 다른 3개의 폴더는 연속되어 있습니다.
결론은 폴더에 176,000개의 파일이 포함되어 있다는 것입니다. 스크립트는 처음 20,000개의 파일을 "split"이라는 폴더로 이동한 다음 다음 20,000개의 파일을 가져오는 식으로 분할2, 분할3 등을 생성합니다.
이것이 내가 가진 것입니다:
#!/bin/bash
dir_size=20000
dir_name="split"
n=$((`find . -maxdepth 1 -type f | wc -l`/$dir_size+1))
for i in `seq 1 $n`;
do
mkdir -p "$dir_name$i";
find . -maxdepth 1 -type f | sort -n -z | head -n $dir_size | xargs -i mv "{}" "$dir_name$i"
done
답변1
- 파일을 나열하고(사용할 수 없거나 이렇게 하면 176000개의 인수가 있는 명령줄이 생성되므로 참고
ls *
)ls*.dpx
이ls
목록 을 (split이 표준 입력을 처리하도록 지시하는 유일한 방법)을 사용하여split
청크(이름이files.01
, ...인 파일)로 분할합니다 .files.02
-
ls | split -d --lines 20000 - files.
find
보다 엄격한 필터링을 위해 이전과 같이split
정렬 후 출력을 파이핑하는 방법을 사용할 수도 있습니다 .
find . type f | sort | split -d --lines 20000 - files.
files.*
숫자 부분을 사용하여 디렉터리 이름을 만든 다음 파일을 이동하여 반복적으로 생성됩니다 .
for f in files.* # iterate the files.*
do
dirname="/path/to/dir${f#*.}" # generate directory name from numeric suffix
mkdir -p "$dirname" # create the directory
xargs mv -t "$dirname" < $f # move the files
done
경고: 테스트되지 않았습니다. 먼저 작은 샘플을 사용해 보십시오.
파일 이름에 공백이 있으면 , 및 를 사용 find -print0
합니다 sort -z
.split --separator '\0'
xargs -0