按顺序名称将一个大文件夹分解为多个子文件夹

按顺序名称将一个大文件夹分解为多个子文件夹

我有一个文件夹,里面有 20000 个文件。我需要将其拆分为目录名称递增的子文件夹(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 ,看看它是否符合您的要求。不管怎样,它会让你知道如何做你想做的事。

相关内容