Назад | Перейти на главную страницу

Пакетное переименование 32000 файлов - разделение на несколько подкаталогов

У меня есть веб-сервер, на который загружены файлы. Существует сценарий, который присваивает им числовые идентификаторы и сохраняет их в соответствующем подкаталоге.

Сейчас у меня 32000 таких загрузок, и это слишком много, чтобы сервер мог обрабатывать их в одном каталоге. В сценарии, который я использую, есть способ загрузки "пространства имен", так что идентификатор 12345 - вместо того, чтобы сидеть в /files/12345 - сидел бы в /files/namespaced/000/012/345.

Код отлично справляется с этим, но теперь у меня 32000 подкаталогов с неправильным стилем именования. Как проще всего просмотреть мои существующие файлы и поместить их в нужное место?

Это предполагает, что в именах каталогов нет нечетных символов, таких как пробелы или символы новой строки, и что нет имен файлов, начинающихся с точки.

Не проверено.

find /files -type d | while read -r dir
do
    base="000000${dir##*/}"
    new="/files/namespaced/${base: -9:3}/${base: -6:3}/${base: -3}"
    mkdir -p "$new"
    mv "$dir/*" "$new"
    rmdir "$dir"
done

Другой способ получить новое имя каталога:

new=$(echo "$dir" | sed 's|...$|/&|;s|\(.*\)/\(.*\)/\(...\)$|\1/namespaced/000000\2/\3|; s|\(.*\)/.*\(...\)\(...\)/\(...\)$|\1/\2/\3/\4|' "$dir")

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

mkdir 1-1000 1001-1999 2000-2999 3000-3999
ls *.jpg | head -1000 | while read line; do mv "$line" "1-1000"; done 

Я бы просто вручную повторил команду с другой папкой, пока я не закончу, я бы просто переименовал файлы в строку sha1, если порядок файлов не важен.