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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

Оффлайн Tpona

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

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

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

Файл:
01bdf9bc03214cc089927815e9053036.jpg

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

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

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

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

Нид хелп )

Оффлайн БТР

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

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

Оффлайн Tpona

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

Оффлайн Tpona

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

Оффлайн F12

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

Оффлайн Azure

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

Оффлайн Tpona

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

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

Оффлайн Azure

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

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

 

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