Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Помогите со скриптом по перемещению файлов  (Прочитано 1042 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tpona

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Доброго дня!

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

Для загружаемых картинок делается название в виде md5-хеша (от времени + некоторая соль) и файлы размещаются в подпапки по первым трем символам след. образом:

Файл:
01bdf9bc03214cc089927815e9053036.jpg

Папка должна называться:
0/01/01b/01bdf9bc03214cc089927815e9053036.jpg

Но ошиблись и сделали так:
0/01/bdf/01bdf9bc03214cc089927815e9053036.jpg
В результате получилось, что почти в каждой папке по 1 файлу, то есть очень фрагментированно размещены.

Мне необходимо написать скрипт, который переложит все правильно.

Есть нюансы:
Общий вес папок около 20 Гб, свободного места на сервере около 5 Гб, нужно, чтобы не перетерлись файлы при возможном совпадении при простом перемещении.

Нид хелп )

Оффлайн БТР

  • Заслуженный пользователь
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6161
    • Просмотр профиля
свалить всё в кучу и разобрать заново не вариант?

совпадение имени по md5 - крайне редкое событие. для подстраховки можно подсчитать количество файлов и количество уникальных имён. Если количество совпадает - значит одинаковых имён нет.

Оффлайн Tpona

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Спасибо за ответ, может и вариант, но файлов очень много, думается совпадение может быть.
Проблема у меня с написанием самого скрипта, не хочу писать PHP-скрипт.
На баше писать наверное надо? Только вот ничего не писал до сих пор, синтаксиса не знаю вообще.

Оффлайн Tpona

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
F12 ???

Оффлайн F12

  • Администратор
  • Старожил
  • *
  • Сообщений: 4402
    • Просмотр профиля

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Для папки, где размещены подпапки
Код: (bash) [Выделить]
#!/bin/bash
for file in $(find -mindepth 4 -iname '*.jpg')
do
    name="${file##*/}"
    dirs="${name::1}/${name::2}/${name::3}"
    mkdir -p "$dirs"
    mv "$file" "$dirs/$name"
done
find -type d -empty -delete
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Tpona

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Для папки, где размещены подпапки
Код: (bash) [Выделить]
#!/bin/bash
for file in $(find -mindepth 4 -iname '*.jpg')
do
    name="${file##*/}"
    dirs="${name::1}/${name::2}/${name::3}"
    mkdir -p "$dirs"
    mv "$file" "$dirs/$name"
done
find -type d -empty -delete

Можно подробнее про вот эту строку?
    name="${file##*/}"

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Advanced Bash-Scripting Guide. 9.3. Подстановка параметров.
Можете использовать basename, только bash builtins для работы с переменными идеологически правильнее и быстрее

P.S. Не стоит цитировать весь ответ, если нужна только 1 строка.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.037 секунд. Запросов: 23.