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


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

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

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

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #15 : 24 Марта 2016, 11:18:36 »
bash 1.sh
7b2a4d53fde834e801c26a2bab7e0240   Handbook of Clinical Drug Data.rtf
====
mv: «/home/user/lib/11/0.pdf» и «/home/user/lib/11/0.pdf» - один и тот же файл
====

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #16 : 24 Марта 2016, 11:39:07 »
Постепенно приходим к нахождению ошибки. Давайте поменяем эту строчку    names[${line%%[[:space:]]*}]=${line#*[[:space:]]}Думаю проблема в том, что при копировании табуляция заменяется пробелами…
« Последнее редактирование: 24 Марта 2016, 11:48:52 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #17 : 24 Марта 2016, 11:43:26 »
bash 1.sh
.rtf
====
mv: «/home/user/lib/11/0.pdf» и «/home/user/lib/11/0.pdf» - один и тот же файл




Пользователь решил продолжить мысль [time]24 Март 2016, 12:45:42[/time]:
в файле names имена с расширениями.

Пользователь решил продолжить мысль 24 Марта 2016, 11:50:14:
В names и md5 нет никаких кавычек и других разделителей. Разделены абзацем наверно. Файлы вкладывал раньше
« Последнее редактирование: 24 Марта 2016, 11:50:14 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #18 : 24 Марта 2016, 12:05:39 »
Чтоб не мучиться с пробелами в именах
Код: (bash) [Выделить]
#!/bin/bash
declare -A  names
while read line
do
    names[${line%^*}]=${line#*^}
done < <(paste -d'^' 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)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #19 : 24 Марта 2016, 12:17:38 »
на одном файле сработало. попробую взять больше.

Пользователь решил продолжить мысль 24 Марта 2016, 12:27:18:
на больших просто мигает курсор и даже первый файл в списке пока не преименован.
можно ли понять, идет ли процесс?
курсор точно также мигал и при выполнении скрипта с ошибками.
« Последнее редактирование: 24 Марта 2016, 12:27:18 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #20 : 24 Марта 2016, 12:27:38 »
ubu12.04ntu, проблема может возникнуть при очень большом количестве — ограничение памяти. Тогда придется решать задачу немного по другому
Если echo не убирали то скрипт застревает на этапе формирования массива…
« Последнее редактирование: 24 Марта 2016, 12:29:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #21 : 24 Марта 2016, 12:31:25 »
Строчки с echo убрал. так же мигает курсор.

Немогли бы вы словами описать код скрипта? он сначала создает базу, а потом сканирует файлы?
Поэтому после bash 1.sh ничего не происходит?

Если склеить оба файла в один - это сути не изменит?





« Последнее редактирование: 24 Марта 2016, 12:35:45 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #22 : 24 Марта 2016, 12:44:18 »
сначала создает базу, а потом сканирует файлы?
Именно так
Если склеить оба файла в один - это сути не изменит?
Если Вы имеете ввиду скорость, то не изменит, но скорее всего для другого пути придется.
Код: (bash) [Выделить]
paste md5.csv names.csv > data.csv
Код: (bash) [Выделить]
find /home/user/lib/ -type f -exec bash -c '
echo mv "$0" "${0%/*}/$(grep -Ff <(md5sum "$0" | cut -f1 -d\ ) data.csv | cut -f2-)"' {} \; | head
Если правильно пути/имена покажет то echo и head убрать


« Последнее редактирование: 24 Марта 2016, 13:01:04 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #23 : 24 Марта 2016, 12:48:10 »
1.sh: строка 5: names[${line%^*}]: неправильный индекс массива

Что это значит?
Думаю, надо сначала создать базу, тем более, она нужна не на один раз.

Пользователь решил продолжить мысль [time]24 Март 2016, 13:50:38[/time]:
paste md5.csv names.csv > data.csvклеить лучше именно через табуляцию?

Пользователь решил продолжить мысль 24 Марта 2016, 12:58:33:
Склеил и запустил, как Вы написали.
Выдает несколько стро типа
md5sum: Дж.: Нет такого файла или каталога

Некоторые файлы переименовал, но похоже, что не все.
« Последнее редактирование: 24 Марта 2016, 12:58:33 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #24 : 24 Марта 2016, 12:59:53 »
Думаю, надо сначала создать базу, тем более, она нужна не на один раз.
Список в файле и массив в оперативной памяти разные вещи.
Выдает несколько стро типа
md5sum: Дж.: Нет такого файла или каталога
Поправил скрипт (добавил кавычки вокруг $0)
« Последнее редактирование: 24 Марта 2016, 13:02:31 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #25 : 24 Марта 2016, 13:03:15 »
Все, кажется сработало. Убрал echo.
    find /home/u/lib/11/ -type f -exec bash -c '
    mv "$0" "${0%/*}/$(grep -Ff <(md5sum "$0" | cut -f1 -d\ ) data.csv | cut -f2-)"' {} \;

Если переименовало файл, хеш и имя которого идут под номером 1,5 млн, значит точно корректно обработает все файлы?

Пользователь решил продолжить мысль [time]24 Март 2016, 14:09:03[/time]:
В моем посте эти кавычки есть? уже запутался, проверьте пожалуйста.

Пользователь решил продолжить мысль 24 Марта 2016, 13:13:41:
Что с длинными именами можно сделать?
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Марта 2016, 13:13:41 от ubu12.04ntu »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #26 : 24 Марта 2016, 13:22:48 »
Это «во что» надо переименовать или «из чего»?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #27 : 24 Марта 2016, 13:24:30 »
В смысле, длинный путь - во что.
А на из чего тоже ограничение? пока не встретилось.

Оффлайн Azure

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

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Re: Скрипт для перименования файлов по md5-хешу
« Ответ #29 : 24 Марта 2016, 15:04:02 »
Что-то долго жевало последний скрипт, переименовало меньше файлов, чем через data.csv
Пожалуй, на том варианте и остановимся, длинные пути проигнорируем да и все.
Спасибо Вам, что помогли наиболее отпимальным путем решить задачу.

Один лишь момент. Посоветуйте, как убрать виндовые переводы строк «\r» в  data.csv? На что их заменить и чем? Или это лучше сделать перед склейкой md5 и names?

 

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