순차적 이름을 기준으로 대규모 폴더를 여러 하위 폴더로 나눕니다.

순차적 이름을 기준으로 대규모 폴더를 여러 하위 폴더로 나눕니다.

20,000개의 파일이 들어 있는 폴더가 있습니다. 디렉터리 이름이 증가하는 하위 폴더(dir_1, dir_2...)로 분할해야 합니다. 각 폴더에는 500개의 파일이 있습니다. 예를 들어 파일이 file_1.png에서 file_20000으로 이동하면 첫 번째 폴더에 처음 500개의 파일이 포함되어야 합니다. file_1부터 file_500까지, 다이렉트 폴더에는 file_501부터 file_1000까지 파일이 연속적으로 포함되어야 합니다. 여기에 이미지 설명을 입력하세요.

답변1

#!/bin/sh

files_per_dir=500

set -- file_*

printf 'There are %d files\n' "$#"
printf 'Putting %d files in each new directory\n' "$files_per_dir"

N=0 # directory counter
n=0 # file counter

for filename do

    if [ "$(( n % files_per_dir ))" -eq 0 ]; then
        N=$(( N + 1 ))
        dir="dir_$N"
        printf 'Creating directory %s\n' "$dir"
        # mkdir "$dir"
    fi

    n=$(( n + 1 ))

    printf 'Moving %s to %s\n' "$filename" "$dir"
    # mv -i -- "$filename" "$dir"

done

위의 코드는 각 디렉토리에 500개의 파일을 넣습니다(내용을 변경하는 실제 명령은 안전을 위해 주석 처리되었습니다). 파일 이름은 일치하는 것으로 간주되며 양의 정수인 file_*각 새 디렉터리에 대해 호출됩니다 .dir_NN

숫자 이름을 기준으로 파일을 이동하려면(위에서는 파일을 사전순으로 정렬함) 다음을 사용하십시오.

printf 'Moving %s to %s\n' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"

대신(즉, 첫 번째 스크립트의 해당 두 줄을 이 순서대로 바꾸세요).


단축 버전:

#!/bin/sh

files_per_dir=500

set -- file_*

n=0

for filename do
    n=$(( n + 1 ))

    N=$(( (n/files_per_dir) + 1 ))
    [ ! -d "dir_$N" ] && mkdir "dir_$N"

    # mv -i -- "$filename" "dir_$N"
    # or...
    # mv -i -- "file_$n" "dir_$N"
done

답변2

cd lotsafiles
for i in {1..20000}; do
  dirnum="$(((i/500)+1))"
  mkdir -p "dir_${dirnum}" # using -p allows this to be less noisy on repeat runs
  mv "file${i}.png" "dir_${dirnum}"/
done

답변3

간단한 일은 다음과 같이 진행됩니다.

#!/bin/bash
typeset -i i
typeset -i j
typeset -i k

i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
   i=$i+1
   k=$k+1
   if [ $i = 500 ] ; then
       j=$j+1
       i=0
       mkdir  dir_$j
   fi
   mv "$file" dir_$j/file_$k
done

테스트되지 않았으므로 echo앞에 추가하여 mv "$file" dir_$j 요구 사항을 충족하는지 확인할 수 있습니다. 어쨌든, 그것은 당신이 원하는 것을 어떻게 할 것인지에 대한 아이디어를 줄 것입니다.

관련 정보