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


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

Автор Тема: Какдобавить префикс (порядковый номер) при групповом переименовании файлов?  (Прочитано 801 раз)

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

zse

  • Автор темы
  • Гость
     — Приветствую всех!
     — Много у нас есть тем  про групповое переименование файлов, однако именно интересующий меня ответ я не нашёл😕
     — Вот например такое выражение:
Код: Text
  1. find /tmp/qaz -type f -execdir rename  -n 's/ /_/g' '{}' \;
т.е. в каталоге qaz во всех файлах находящихся в каталоге и подкаталогах будут заменены пробелы на „_“.
     — Аналогичным способом ко всем файлам может быть добавлен „статический“ префикс. Однако нужен „динамический😈“ префикс в  виде порядкового номера 0001…0002…0003_FileName.xxx.
     — Регулярного выражения для rename, которое бы добавляло префикс в виде порядкового номера я не нашёл. Может его даже нет.
     — Получается что только awk, которое я никак не могу освоить…😞
     — Как добавить префикс к имени файла в виде порядкового номера?
Код: Text
  1. find /tmp/qaz -type f -execdir ❰Выражение которое добавит номер к именам файлов во всех каталогах и подкаталогах❱ '{}' \;

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4258
  • Capture the truth
    • Просмотр профиля
Код: Bash
  1. F=0
  2. while read I ; do
  3. mv "$I" "$F_$I"
  4. ((F++))
  5. done < <(find /tmp/qaz -type f)

Linux cейчас нет под рукой, проверить не могу

Пользователь добавил сообщение 17 Июль 2018, 17:33:25:
c лидирующими нулями
Код: Bash
  1. F=0
  2. while read I ; do
  3. Z=$(printf %04d $F) # нулями дополняем до 4х знаков
  4. mv "$I" "$Z_$I"
  5. ((F++))
  6. done < <(find /tmp/qaz -type f)
« Последнее редактирование: 17 Июль 2018, 17:33:25 от ALiEN175 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15570
  • Глухонемой (Deaf)
    • Просмотр профиля
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн zg_nico

  • Заслуженный пользователь
  • Модератор форума
  • Старожил
  • *
  • Сообщений: 3511
  • Nil mortalibus arduum est
    • Просмотр профиля
zse, наверное предложу совсем деревянный метод, но вот такое сейчас "накалякал": SAVEIFS=$IFS; IFS=$'\n'; L=($( find ./ -type f )); for (( i=0; i<${#L[@]}; i++ )); do mv "${L[$i]}" "./$( printf "%05d\n" $i)_$(basename -- "${L[$i]}")"; done; IFS=$SAVEIFSПроверил. Работает. Исполнять естественно из той директории, где собираемся переименовывать (перешли в папку в nautilus, открыли контекстное меню, выбрали пункт "Открыть в терминале", убедились что в командной строке присутствует путь до директории, далее вставляем однострочник и выполняем его, нажав Enter). До скрипта:>>> ls
1110.m3u                                                  IPTV.m3u
178.167.7.169 7777 Wireless_network_in_Moscow_region.m3u  metro.m3u
34345.m3u                                                 output.m3u
ALL_DONE.m3u                                              playlist.m3u
Auto IPTV.m3u                                             tele.usite.pro.m3u
Fluxus.m3u                                                ufa.m3u
iptvchannels.m3u
После скрипта:>>> ls
00000_output.m3u
00001_1110.m3u
00002_34345.m3u
00003_Fluxus.m3u
00004_tele.usite.pro.m3u
00005_iptvchannels.m3u
00006_IPTV.m3u
00007_ufa.m3u
00008_playlist.m3u
00009_178.167.7.169 7777 Wireless_network_in_Moscow_region.m3u
00010_Auto IPTV.m3u
00011_metro.m3u
00012_ALL_DONE.m3u
« Последнее редактирование: 17 Июль 2018, 18:49:57 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

zse

  • Автор темы
  • Гость
    — Спасибо всем! Пробую, о результатах сообщу дополнительно!
2018 Jul 17; 11:34 AM

Пользователь добавил сообщение 17 Июль 2018, 20:05:30:
     — Спасибо, zg_nico, работает эта композиция, но предварительно нужно выполнить:
Код: Text
  1. find /tmp/qaz -type f -execdir rename  's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;
  2. find /tmp/qaz/ -type f -execdir rename   's/ /_/g' '{}' \;
т.е. нужно удалить из названий файлов спецсимволы и пробелы, но это очевидно, потому что построить выражение на основе mv для файлов с пробелами и спецсимволами наверное нереально😞
     — Файлы все „вытаскиваются“ из своих директорий в директории где применяется созданная Вами команда. Ну это нормально всё равно для дальнейших действий эти файлы нужно было бы собрать в одну директорию.
     — Чисто теоретический интерес представляет конечно попытка переименовать все файлы „на месте“😈
     — У Вас, victor00000, концепт, спасибо, я Вас понял!
     — Спасибо, ALiEN175, что-то не хочет переименовывать не только файлы с пробелами но и обработанные файлы без пробелов и спецсимволов пишет„are the same file
2018 Jul 17; 01:07 PM
« Последнее редактирование: 17 Июль 2018, 20:07:24 от zse »

Оффлайн theurs

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

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4258
  • Capture the truth
    • Просмотр профиля
zse, да, не учёл путь.
там с $(basename $I) надо играться)
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн zg_nico

  • Заслуженный пользователь
  • Модератор форума
  • Старожил
  • *
  • Сообщений: 3511
  • Nil mortalibus arduum est
    • Просмотр профиля
Наутилус умеет сам такое делать
Поясните пожалуйста: что именно "умеет" делать nautilus? В папки переходить, или файлы группами переименовывать? У меня на Ubuntu 16.04 c GNOME nautilus 3.14.3 в контекстных меню пункт "переименовать" при выделении нескольких файлов не активен, по F2 никакой реакции, в меню "Правка" пункт тоже не активным становится. Расширениями это можно решить, но в чистом виде, насколько я знаю, nautilus группового переименования делать не умеет.
Чисто теоретический интерес представляет конечно попытка переименовать все файлы „на месте“
zse, сейчас под скрипт для nautilus перепишу, и объясню куда положить. Будете выделять файлы мышкой, жамкать правую клавишу, выбирать скрипт в контекстном меню, после чего файлы будут переименовываться скриптом.

Пользователь добавил сообщение 18 Июль 2018, 02:51:47:
zse, сделал. Проверил. Работает. Чтобы работало и у Вас. Открываем терминал. Выполняем последовательно команды: mkdir -p $HOME/.local/share/nautilus/scripts/
gedit $HOME/.local/share/nautilus/scripts/Rename
В окне редактора вводим код:
Код: Bash
  1. #!/bin/bash
  2. # Скрипт для NAUTILUS
  3. # "Групповое переименование выделенных файлов"
  4. # В имени каждого файла знаки не из набора 0-9a-zA-Zа-яА-Я заменяются символом _
  5. # Более одного пробела будут заменены одним символом _
  6. # Операция выполняется только если выделены файлы и только если есть права на запись
  7. # перед именем файла дописывается его порядковый номер в каталоге (начиная с 0),
  8. # номер файла прописывается в формате 0001, число нулей динамическое - зависит
  9. # от количества выделенных файлов (выделишь до 10 файлов - будет без нулей впереди,
  10. # выделишь от 10 до 100 файлов - будет 2х значное число и т.д.)
  11. # Скрипт следует положить в каталог $HOME/.local/share/nautilus (если такого нет - СОЗДАТЬ)
  12. # Скрипту дать права на исполнение. Контекстное меню скриптов можно вызвать только на файлах!
  13.  
  14. SAVEIFS=$IFS                                                                        # сохраняем текущий системный разделитель IFS
  15. IFS=$'\n'                                                                           # выставляем в качестве IFS символ перевода строки
  16. if [[ $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS == "" ]]; then exit 0; fi                # Если ничего не выбрано то сразу выходим из программы
  17. k=$( echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | wc -l)                        # количество выбранных файлов
  18. k=$( echo $k | wc -m ); (( k=k-1 ))                                                 # наше число нулей в общей длине строки
  19. L=($( echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ))                             # берем выбранные файлы массивом (мне так проще)
  20. for (( i=0; i<${#L[@]}; i++ ))                                                      # перебираем выделение по одному файлу
  21. do
  22.     if [ -w "${L[$i]}" ]; then                                                      # файл существует и есть права на запись
  23.         Oldname=$( basename -- "${L[$i]}" )                                         # получаем имя файла без пути к нему
  24.         Fpathname=${L[$i]/$Oldname/}                                                # получаем путь к файлу
  25.         Fbasename=${Oldname%%.*}                                                    # отбрасываем расширение файла
  26.         Fbasename=$( echo $Fbasename | sed -e 's/\ \{1,\}/\ /g' )                   # Заменяем более одного пробела одним пробелом
  27.         Fbasename=$( echo $Fbasename | sed -e 's/[^a-zA-Z0-9а-яА-Я]/_/g' )          # все знаки не из перечня заменяем на подчеркивания
  28.         Fbasename=${Oldname/${Oldname%%.*}/$Fbasename}                              # приписываем расширение
  29.         Fnumpref=$( printf "%0"$k"d\n" $i )                                         # форматируем цифровой префикс
  30.         mv "$Fpathname$Oldname" "$Fpathname$Fnumpref"\_"$Fbasename"                 # переименовываем файл
  31.     fi
  32. done
  33. IFS=$SAVEIFS                                                                        #восстанавливаем исходный системный разделитель IFS
  34. exit 0;
Сохраняем. Закрываем окно gedit. В терминале выполняем: sudo chmod + $HOME/.local/share/nautilus/scripts/RenameВаши требования, zse, вроде как удовлетворяет. Модернизируйте на свой вкус. Примеры работы. До выполнения скрипта:>>> ls
afqkbr.m3u               произвольный файл.m3u  файл_2.m3u    фаленёнок.m3u
file_3.m3u               самый первый.m3u       файл_4.m3u
еще один файл.m3u        список.m3u             фай??лик.m3u
еще файл other text.m3u  условный файл.m3u      файлище.m3u
после выполнения скрипта:
Цитировать
>>> ls
00_afqkbr.m3u               05_самый_первый.m3u   10_фай__лик.m3u
01_file_3.m3u               06_список.m3u         11_файлище.m3u
02_еще_один_файл.m3u        07_условный_файл.m3u  12_фаленёнок.m3u
03_еще_файл_other_text.m3u  08_файл_2.m3u
04_произвольный_файл.m3u    09_файл_4.m3u
Вот как это выглядит в Nautilus в моем случае:
У Вас будет пункт меню "Сценарии"/"Scripts" [появляется только при вызове контекстного меню на файле/группе файлов/папке, - на пустом месте в папке не работает в nautilus по состоянию на Ubuntu 16.04], где следует искать Rename (так мы назвали скрипт). Если название не устраивает - просто переименуйте файл ;)
И да, я в курсе что вместо Fbasename=$( echo $Fbasename | sed -e 's/\ \{1,\}/\ /g' )
Fbasename=$( echo $Fbasename | sed -e 's/[^a-zA-Z0-9а-яА-Я]/_/g' )
можно и просто Fbasename=$( echo $Fbasename | sed -e 's/[^a-zA-Z0-9а-яА-Я]\{1,\}/_/g' )(в необходимости экранирования {1,} я не уверен, возможно что сработало бы и Fbasename=$( echo $Fbasename | sed -e 's/[^a-zA-Z0-9а-яА-Я]{1,}/_/g' )Просто честно - не силен я в этом. Так, вникаю потихоньку... :)
« Последнее редактирование: 18 Июль 2018, 02:56:58 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

zse

  • Автор темы
  • Гость
    — Благодарю, коллеги, но смотреть буду уже утром…
2018 Jul 17; 11:11 PM (23-11…)

Пользователь добавил сообщение 18 Июль 2018, 14:17:21:
     — Спасибо, zg_nico, всё я сделал, всё работает! У меня тоже в Nautilus много скриптов, компоновка чуть другая:
(Нажмите, чтобы показать/скрыть)
     — Часть скриптов непосредственно в директориях Nautilus (/home/fjf/.local/share/nautilus/scripts), часть запускается скриптами Nautilus же но из общей директории скриптов. Т.е. скрипт используется и Nautilus и из терминала тоже.
     — Как там фильм:„Национальные особенности охоты😇“, а это национальные особенности размещения скриптов Nautilus😈 ! Скрипты я люблю, а Вас уважаю! Ещё раз спасибо!!!
2018 Jul 18; 07:16 AM


Пользователь добавил сообщение 18 Июль 2018, 14:18:56:
     — ALiEN175, я продолжаю разбираться, спасибо…
« Последнее редактирование: 18 Июль 2018, 14:18:57 от zse »

 

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