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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

zse

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

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7813
  • We were here
    • Просмотр профиля
Код: (bash) [Выделить]
F=0
while read I ; do
mv "$I" "$F_$I"
((F++))
done < <(find /tmp/qaz -type f)

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

Пользователь добавил сообщение 17 Июля 2018, 17:33:25:
c лидирующими нулями
Код: (bash) [Выделить]
F=0
while read I ; do
Z=$(printf %04d $F) # нулями дополняем до 4х знаков
mv "$I" "$Z_$I"
((F++))
done < <(find /tmp/qaz -type f)
« Последнее редактирование: 17 Июля 2018, 17:33:25 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Wars ~.o

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3512
  • 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, работает эта композиция, но предварительно нужно выполнить:
Код: (sh) [Выделить]
find /tmp/qaz -type f -execdir rename  's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;
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

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

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7813
  • We were here
    • Просмотр профиля
zse, да, не учёл путь.
там с $(basename $I) надо играться)
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3512
  • 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) [Выделить]
#!/bin/bash
# Скрипт для NAUTILUS
# "Групповое переименование выделенных файлов"
# В имени каждого файла знаки не из набора 0-9a-zA-Zа-яА-Я заменяются символом _
# Более одного пробела будут заменены одним символом _
# Операция выполняется только если выделены файлы и только если есть права на запись
# перед именем файла дописывается его порядковый номер в каталоге (начиная с 0),
# номер файла прописывается в формате 0001, число нулей динамическое - зависит
# от количества выделенных файлов (выделишь до 10 файлов - будет без нулей впереди,
# выделишь от 10 до 100 файлов - будет 2х значное число и т.д.)
# Скрипт следует положить в каталог $HOME/.local/share/nautilus (если такого нет - СОЗДАТЬ)
# Скрипту дать права на исполнение. Контекстное меню скриптов можно вызвать только на файлах!

SAVEIFS=$IFS                                                                        # сохраняем текущий системный разделитель IFS
IFS=$'\n'                                                                           # выставляем в качестве IFS символ перевода строки
if [[ $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS == "" ]]; then exit 0; fi                # Если ничего не выбрано то сразу выходим из программы
k=$( echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | wc -l)                        # количество выбранных файлов
k=$( echo $k | wc -m ); (( k=k-1 ))                                                 # наше число нулей в общей длине строки
L=($( echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ))                             # берем выбранные файлы массивом (мне так проще)
for (( i=0; i<${#L[@]}; i++ ))                                                      # перебираем выделение по одному файлу
do
    if [ -w "${L[$i]}" ]; then                                                      # файл существует и есть права на запись
        Oldname=$( basename -- "${L[$i]}" )                                         # получаем имя файла без пути к нему
        Fpathname=${L[$i]/$Oldname/}                                                # получаем путь к файлу
        Fbasename=${Oldname%%.*}                                                    # отбрасываем расширение файла
        Fbasename=$( echo $Fbasename | sed -e 's/\ \{1,\}/\ /g' )                   # Заменяем более одного пробела одним пробелом
        Fbasename=$( echo $Fbasename | sed -e 's/[^a-zA-Z0-9а-яА-Я]/_/g' )          # все знаки не из перечня заменяем на подчеркивания
        Fbasename=${Oldname/${Oldname%%.*}/$Fbasename}                              # приписываем расширение
        Fnumpref=$( printf "%0"$k"d\n" $i )                                         # форматируем цифровой префикс
        mv "$Fpathname$Oldname" "$Fpathname$Fnumpref"\_"$Fbasename"                 # переименовываем файл
    fi
done
IFS=$SAVEIFS                                                                        #восстанавливаем исходный системный разделитель IFS
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.035 секунд. Запросов: 24.