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