Пакетное переименование 32000 файлов - разбиение на несколько подкаталогов
У меня есть веб-сервер, на который загружены файлы. Существует скрипт, который присваивает им числовые идентификаторы и сохраняет их в соответствующем подкаталоге.
Теперь у меня есть 32000 таких загрузок, и это слишком много, чтобы сервер мог обработать их в одном каталоге. Скрипт, который я использую, имеет способ "загрузки пространства имен", чтобы идентификатор 12345 - вместо того, чтобы сидеть в /files/12345
- будет сидеть в /files/namespaced/000/012/345
,
Код может с этим справиться, но теперь у меня 32000 подкаталогов в неправильном стиле именования. Какой самый простой способ просмотреть мои существующие файлы и поместить их в нужное место?
2 ответа
Это предполагает, что имена каталогов не имеют каких-либо нечетных символов, таких как пробелы или символы новой строки в их именах, и что нет имен файлов, начинающихся с точки.
Непроверенные.
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, если порядок файлов не важен.