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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Скрипт для перименования файлов по md5-хешу  (Прочитано 2188 раз)

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

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Есть два файла, оба UTF-8, оба по 1,5 млн строк:
md5.csv, содержащий хеши файлов, только нижний регистр символов.
(Нажмите, чтобы показать/скрыть)
names.csv, содержащий имена файлов (без каталогов) в строгом соответствии по строкам их хешам.
(Нажмите, чтобы показать/скрыть)
И есть каталог, содержащий покаталоги с файлами с отфанарными именами.
Нужен скрипт, который даст файлам, совпадающим по хешу с md5.csv имена из names.csv и оставит их в тех же подкаталогах.

Можно ли сделать скрипт под Ubuntu, который сначала из таблицы извлечет встречающиеся файлы, а потом их переименует?
Важно найти наиболее рациональный по времени выполнения задания путь, т.к. процедуру необходимо повторять много раз.
« Последнее редактирование: 23 Марта 2016, 14:26:40 от ubu12.04ntu »

Punko

  • Гость
ubu12.04ntu, Мне кажется нет смысла

Цитировать
который сначала из таблицы извлечет встречающиеся файлы, а потом их переименует?

Потому что придётся два раза искать файлы эти - первый раз при проверке есть ли они в системе(а так как это не один каталог, то придётся рекурсивно проверять), а второй раз точно такой же поиск делать для переименования.

Наверно лучше в одном цикле искать файл и при возвращении true сразу его переименовывать. Только надо подумать, как взять нужное новое имя.

А вообще 1.5 млн в тхт это пипец, вы не задумывались о базе данных?


Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Для квалифицированого ответа хотелось бы увидеть пример такой таблицы (10-20 строк). Не совсем понятно про сотни подпапок. Оптимально было бы увидеть тоже пример из 10-15 файлов (расположение с подпапками)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Немного изменил задачу, помогите пожалуйста.
Скрипты не делал. Знаю только, что есть md5sum.
Надеюсь, что задача быстро решается в несколько строк.

Пользователь решил продолжить мысль [time]23 Март 2016, 15:58:14[/time]:
Может напр. сначала вывести md5 всех файлов сканируемого каталога
find -type f -exec md5sum -b {} + > check_sum.md5а потом сравнивать с md5.csv?
Или сравнение возможно только при одинаковой сортировке хешей в файлах, напр. по алфавиту?
« Последнее редактирование: 23 Марта 2016, 18:04:28 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Если не будет проблем с памятью (всё-таки 1,5 млн) можно попробовать через массив
Код: (bash) [Выделить]
#!/bin/bash
declare -A  names
while read line
do
    names[${line% *}]=${line#* } #тут <Таб> а не пробелы
done < <(paste md5.csv names.csv)
while read mfile
do
    mdsum=$(md5sum "$mfile")
    mv "$mfile" "${mfile%/*}/${names[${mdsum%% *}]}"
done < <(find <каталог> -type f)
« Последнее редактирование: 24 Марта 2016, 00:45:12 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
done < <(find </home/user/lib/11/> -type f)Правильно вставил?
Почему тогда
:~/lib$ bash 1.sh
find: `f': Нет такого файла или каталога

Пробовал на мелких файлах, по одной строчке в каждом

Пользователь решил продолжить мысль 23 Марта 2016, 23:17:24:
И почему-то появился файл -type в папке lib
« Последнее редактирование: 23 Марта 2016, 23:17:24 от ubu12.04ntu »

Punko

  • Гость
ubu12.04ntu,
уберите < >
Это для примера было. Сам путь просто как путь.

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
<> оттуда убрал
Выдало
mv: «/home/user/lib/11/0.pdf» и «/home/uer/lib/11/0.pdf» - один и тот же файл
А файл не переименовало.

Punko

  • Гость
ubu12.04ntu, ну теперь вопрос к Azure.

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Я мало понимаю и мне странно, что в скрипте нет if.
Ведь если md5sum файла равно строке из md5.csv, то тогда переименовать файл в строку из names.csv

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #10 : 24 Марта 2016, 00:41:06 »
Давайте вставим перед mv echo и посмотрим:
Код: (bash) [Выделить]
echo "$mdsum <> ${names[${mdsum% *}]} <> ${mfile%/*}"
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #11 : 24 Марта 2016, 10:16:43 »
7b2a4d53fde834e801c26a2bab7e0240  /home/user/lib/11/0.pdf <>  <> /home/user/lib/11
mv: «/home/user/lib/11/0.pdf» и «/home/user/lib/11/0.pdf» - один и тот же файл
Запускал так  bash 1.sh
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Марта 2016, 10:18:24 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #12 : 24 Марта 2016, 10:27:42 »
Фокус в том, что или имени с таким хэш не существует, nl md5.csv | grep -F '7b2a4d53fde834e801c26a2bab7e0240'или что-то не сработало в плане создания массива имен. paste md5.csv names.csv | headВы пути правильно до файлов  md5.csv names.csv прописали? Там действительно каждое имя/хэш на отдельной строке?
« Последнее редактирование: 24 Марта 2016, 10:30:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #13 : 24 Марта 2016, 10:49:48 »
 nl md5.csv | grep -F '7b2a4d53fde834e801c26a2bab7e0240'
     1   7b2a4d53fde834e801c26a2bab7e0240

paste md5.csv names.csv | head
7b2a4d53fde834e801c26a2bab7e0240   Handbook of Clinical Drug Data.rtf

Пробую на 1 файле, точно правильный хеш, файлы вложил.
« Последнее редактирование: 24 Марта 2016, 10:54:34 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #14 : 24 Марта 2016, 11:06:11 »
Код: (bash) [Выделить]
#!/bin/bash
declare -A  names
while read line
do
    names[${line%       *}]=${line#*    }       #тут <Таб> а не пробелы
done < <(paste md5.csv names.csv)
echo "${names[@]}" | head
while read mfile
do
    mdsum=$(md5sum "$mfile")
    echo "==${names[${mdsum%% *}]}=="
    mv "$mfile" "${mfile%/*}/${names[${mdsum%% *}]}"
done < <(find <каталог> -type f)
потом строки с echo можно убрать
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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