1

Справочная информация: веб-сайт клиента хранит фотографии профиля пользователя и другие вложения в единую плоскую папку /user/images/*user_id* . Недавно они достигли предела каталогов (echo */ | wc 31998 , файловая система ext3), поэтому мне нужно разделить их на более мелкие куски.

Папки пользователя в /user/images основаны на идентификаторе пользователя, хранящемся в БД. Есть несколько каталогов без нумерации, которые следует игнорировать.

Я создал небольшой скрипт bash, который отлично работает в моей тестовой среде, но я хотел бы узнать ваше мнение по этому поводу:

#!/usr/bin/env bash

for D in *; do
    if [ -d "${D}" ]; then # check if it's a directory

        echo "Directory: ${D}"

        if [ "${D}" -eq "${D}" ] 2>/dev/null # check if directory is a valid integer / number based
        then
            pre=${D:0:1} # $pre = first letter of the directory name
            echo "Subdir: ${pre}"

            if [[ ! -d "${pre}" ]] # check if directory $pre exists
            then
                mkdir "${pre}" # directory $pre does not exist, create it
                echo "Created subdir ${pre}..."
            fi

            mv "${D}" "${pre}" # move $d into $pre
            echo "Moved ${D} into ${pre}..."

        else
            echo "Directory: ${D} is not number based, i.e. not based on a user id. Skipping..."
        fi
    fi
done

Я бы приветствовал любые предложения или советы по оптимизации, прежде чем запускать это на сервере.

1 ответ1

0

Вы можете использовать mkdir -p чтобы избежать проверки, существует ли каталог, если только вам действительно не нужно сообщение Created subdir ${pre} .

Поскольку вы достигли предела каталогов, возможно, вы захотите создать новые каталоги где-то еще, переместить в них материал (таким образом, освободив место в полном каталоге) и, наконец, переместить новый каталог обратно в исходный каталог.

Кроме того, использование параметра -n для mv может помочь предотвратить случайную потерю данных.

Еще одна мысль - расширение подстановочного знака «звезда» может превышать максимальную длину строки bash. Если это так, вы можете направить вывод ls -1 в цикл while, который читает входные данные построчно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .