Я пытался разделить папку на несколько меньших папок. Для каждой папки существует максимальный размер, и заданные файлы, файлы с одинаковым базовым именем и разным расширением, должны быть вместе в одной папке. Вот как выглядит результат
echo -e "folder size limit: "
read file_max_amount
if [ $file_max_amount -le 5000 ]; then
if [ $file_max_amount -lt 10 ]; then
file_max_amount=10
fi
else
file_max_amount=5000
fi
folder_count=1
file_amount=0
folder_name='upload'$folder_count
file_name=(`find . -type f \( ! -iname "*.sh" -and ! -iname "*.bat" -and ! -iname ".*" \)`)
mkdir $folder_name
for file in ${file_name[@]}; do
basename=`basename $file`
name="${basename%.*}"
set_files=(`find . -maxdepth 1 -type f -name $name".*" `)
set_file_amount=${#set_files[@]}
if [ $len -eq 0 ]; then
continue
else
file_amount=`expr $file_amount + $set_file_amount`
if [ $file_amount -gt $file_max_amount ]; then
folder_count=`expr $folder_count + 1`
folder_name='upload'$folder_count
mkdir $folder_name
file_amount=$set_file_amount
fi
for set_file in "${set_files[@]}"; do
mv $set_file $folder_name
done
fi
done
Это работает, но это занимает немного больше времени, когда есть более 10000. Это заняло 20 минут для 20000 файлов для моего ноутбука. мой коллега сказал, что может быть быстрее, если я использую память, а не ввод-вывод. Поэтому я попытался проверить набор файлов, используя массив, а не find . -maxdepth 1 -type f -name $name".*"
. Вот так.
echo -e "folder size limit: "
read file_max_amount
if [ $file_max_amount -le 5000 ]; then
if [ $file_max_amount -lt 10 ]; then
file_max_amount=10
fi
else
file_max_amount=5000
fi
folder_count=1
file_amount=0
folder_name='upload'$folder_count
file_name=(`find . -maxdepth 1 -type f \( ! -iname "*.sh" -and ! -iname "*.bat" -and ! -iname ".*" \)`)
base_name_arr=()
mkdir $folder_name
for file_1 in ${file_name[@]}; do
if [ ! -f $file_1 ]; then
echo 1
continue
fi
basename_1=`basename $file_1`
name="${basename_1%.*}"
arr=()
count=0
count_1=0
for file_2 in ${file_name[@]}; do
count_1=`expr $count_1 + 1`
echo "1"$file_2
basename_2=`basename $file_2`
if [[ $basename_2 == $name"."* ]]; then
count=`expr $count + 1`
arr[$count]=$file_2
fi
done
file_amount=`expr $file_amount + $count`
if [ $file_amount -gt $file_max_amount ]; then
folder_count=`expr $folder_count + 1`
folder_name='upload'$folder_count
mkdir $folder_name
file_amount=$count
fi
for attr in ${arr[@]}; do
mv $attr $folder_name
done
done
Но ради бога, это заняло больше времени, чем моя первая версия ... Так что мне нужна помощь !!