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_N
N
숫자 이름을 기준으로 파일을 이동하려면(위에서는 파일을 사전순으로 정렬함) 다음을 사용하십시오.
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
요구 사항을 충족하는지 확인할 수 있습니다. 어쨌든, 그것은 당신이 원하는 것을 어떻게 할 것인지에 대한 아이디어를 줄 것입니다.