Как я могу улучшить (чтобы сократить время) мой код сценария оболочки ?? Я пытаюсь разделить папку на несколько меньших папок - PullRequest
0 голосов
/ 23 апреля 2020

Я пытался разделить папку на несколько меньших папок. Для каждой папки существует максимальный размер, и заданные файлы, файлы с одинаковым базовым именем и разным расширением, должны быть вместе в одной папке. Вот как выглядит результат

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

Но ради бога, это заняло больше времени, чем моя первая версия ... Так что мне нужна помощь !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...