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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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

Оффлайн sergey113

  • Автор темы
  • Забанен
  • Активист
  • *
  • Сообщений: 407
  • равновесие
    • Просмотр профиля
    • Недоделанный сайт :)
Возникла необходимость в массовом переименовании / замене символов в имени файлов. Гугл показал на русском какие-то излишне навороченные команды и даже скрипты не всегда нормально объясненные.  Чтобы разрушить эту ущербную традицию рунета выкладываю тут удобную команду для выполнения моей задачи.  Может быть адаптирована под нужды каждого.
Команда заменяет символ :  в имени фалов (только файлов- это можно изменить) на символ _
find ./ -type f -exec rename -v 'y/:/_/' {} \;Состоит из двух подкоманд:
1 - find ./ -type f -exec КОМАНДА2 \;
2 - rename -v 'y/:/_/' {}
Первая команда получает имена файлов.  Вторая переименовывает файлы по шаблону
find ./ -type f -exec КОМАНДА2 \;Расшифровка 1 команды: Команда find с параметром ./ (искать в директории откуда вызвана) с параметром -type f (выбрать только имена файлов, а можно и другие,см man find ) с параметром -exec (вызывает другую команду внутри выполнения этой команды) заканчивается обязательным символом \; (так придумал это создатель команды, такое у нее оформление)
rename -v 'y/:/_/' {}Расшифровка 2 команды: Команда rename с параметром -v (отображение списка переименованных файлов при выполнении) затем обязательный параметр с перл образным выражением 'y/:/_/' (указываем Y замена символов : на _) и еще один параметр {} (Это маска имени файла которое обрабатывается на данном этапе командой find)

Вот так... проще команды я не нашел. Мне кажется команда достаточно простая  и настраивамая под свои нужды.  Так как rename с Perl образными выражениями имеет много вариаций.  Хорошей статьи по Perl выражениям я не нашел. Но каждый может поискать то выражение которое ему надо поиском.
Что еще важно в команде rename можно добавить параметр -n  и посмотреть без применения изменений какие файлы, директори и ссылки берутся. Это поможет избежать фатальных ошибок.

Для легкости набора можно прописать алиас в .bashrc в домашней директории (жирным выделил имя короткой команды)
alias picren='find ./ -type f -exec rename -v 'y/:/_/' {} \;'

Перегрузится и будет доступна команда для переименования из консоли рекурсивно фалов. НО ПОМНИТЕ!!! что применив ее зачистите каталог и подкаталоги из которого она вызвана.

На один сеанс можно в терминале набрать
alias picren='find ./ -type f -exec rename -v 'y/:/_/' {} \;'Эта команда будет доступна на один сеанс.

Вот тут не плохо кстати написано про find :)
https://ru.wikipedia.org/wiki/Find
Тут можно ознакомиться с rename
http://www.linuxsuxx.org/sovety/vsem/kratkij-spravochnik-po-massovomu-pereimenovyvaniyu-fajlov.html
http://rus-linux.net/MyLDP/consol/rename.html

« Последнее редактирование: 15 Октября 2015, 22:35:31 от sergey113 »
ubuntu 14.04+firefox+virtualbox+windows=туда-сюда ::)
dell 1220-Core2Duo 2200МГц (T6670)-4Gb DDR2-800МГц-Intel GMA 4500MHD-ЗВУК Intel HDA-HTS725050A7E630

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
А что это вообще было? Если попытка распространения знаний, то давайте распространять то, в чём разбираетесь. Если мы говорим про файлы, то Ваша команда внесет переименование и в имена папок. Избежать этого можно изменив командуfind ./ -type f -execdir rename -v 'y/:/_/' {} +
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн sergey113

  • Автор темы
  • Забанен
  • Активист
  • *
  • Сообщений: 407
  • равновесие
    • Просмотр профиля
    • Недоделанный сайт :)
find с параметром -type f  отбирает только имена папок. Почему будут переименованы папки?
ubuntu 14.04+firefox+virtualbox+windows=туда-сюда ::)
dell 1220-Core2Duo 2200МГц (T6670)-4Gb DDR2-800МГц-Intel GMA 4500MHD-ЗВУК Intel HDA-HTS725050A7E630

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
sergey113,
find c с параметром -type f отбирает только файлы, но выводит их вместе с путями по отношению к папке где начинался поиск, в данном случае ./. Например ./подпапка_уровень1/подпапка_уровень2/имя_файла и если к такому применить rename так как у Вас в скрипте то будут меняться не только имена файлов, но и имена соответствующих подпапок (ну если изменяемые символы есть и в них конечно же).
Больше того, переименование имен подпапок вызовет перемещение изменённых файлов в подпапки с новыми именами если такие существуют или выдаст ошибку в противном случае.
« Последнее редактирование: 16 Октября 2015, 00:36:21 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн sergey113

  • Автор темы
  • Забанен
  • Активист
  • *
  • Сообщений: 407
  • равновесие
    • Просмотр профиля
    • Недоделанный сайт :)
Я проверил добавил символ в название папки и она не переименовалась.
Получается, что команда работает достаточно корректно.
ubuntu 14.04+firefox+virtualbox+windows=туда-сюда ::)
dell 1220-Core2Duo 2200МГц (T6670)-4Gb DDR2-800МГц-Intel GMA 4500MHD-ЗВУК Intel HDA-HTS725050A7E630

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6723
  • 20% Cooler
    • Просмотр профиля
уже давно использую, и не только для двоеточия
tr \*\?\<\:\>\/\\ _
🖥 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

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Я проверил добавил символ в название папки и она не переименовалась.
Получается, что команда работает достаточно корректно.
Да что Вы говорите!
Код: (bash) [Выделить]
user@user:path$ mkdir ll:oo
mkdir: создан каталог «ll:oo»
user@user:path$ touch ll:oo/aa:{1..6}
user@user:path$ ls ll:oo
aa:1  aa:2  aa:3  aa:4  aa:5  aa:6
user@user:path$ find -type f -name '*:*' -exec rename -n 'y/:/_/' {} \;
./ll:oo/aa:1 renamed as ./ll_oo/aa_1
./ll:oo/aa:2 renamed as ./ll_oo/aa_2
./ll:oo/aa:3 renamed as ./ll_oo/aa_3
./ll:oo/aa:4 renamed as ./ll_oo/aa_4
./ll:oo/aa:5 renamed as ./ll_oo/aa_5
./ll:oo/aa:6 renamed as ./ll_oo/aa_6
user@user:path$ find ./ -type f -name '*:*' -exec rename -v 'y/:/_/' {} \;
Can't rename ./ll:oo/aa:1 ./ll_oo/aa_1: Нет такого файла или каталога
Can't rename ./ll:oo/aa:2 ./ll_oo/aa_2: Нет такого файла или каталога
Can't rename ./ll:oo/aa:3 ./ll_oo/aa_3: Нет такого файла или каталога
Can't rename ./ll:oo/aa:4 ./ll_oo/aa_4: Нет такого файла или каталога
Can't rename ./ll:oo/aa:5 ./ll_oo/aa_5: Нет такого файла или каталога
Can't rename ./ll:oo/aa:6 ./ll_oo/aa_6: Нет такого файла или каталога

Пользователь решил продолжить мысль [time]16 Октябрь 2015, 01:22:49[/time]:
tr \*\?\<\:\>\/\\ _
Не утомляет слэши рисовать?
Код: (bash) [Выделить]
tr '*?<:>/\\ ' '_'
« Последнее редактирование: 16 Октября 2015, 01:27:18 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Гость
2015 Oct 15; 07:30 PM; Oakville, ON, Canada.

— Поделиться знаниями это дело, конечно, полезное. :) Спасибо sergey113 !!!

— Но даже написанное совсем-совсем профессионалами долго тестируется как операционная система, к примеру, и всё равно какие-то там ошибки находятся.

— Потому нужно, sergey113, Вы уж извините, такие вещи сопровождать предложением проверить на „белых мышах“ и „лабораторных крысах“  :)

— Вот я обязательно проверю предложенное Вами и Azure и напишу о своих впечатлениях, я такие вещи собираю, потому как сам не всегда в состоянии что-то серьёзное „изваять“ :) Я разработал схему описания и поиска по своей базе скриптов и команд и стараюсь эту базу обновлять и пополнять.


Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
adawdp,
Тут дело не в том что «не работает», а есть, как говорят, нюансы. Надо их или знать, т.е. учитывать поведение команды в некоторых ситуациях, или предусматривать в самой команде. Посему предлагаю Вам поделиться с сообЧеством коллекцией, а мы, в свою очередь, поковыряем её на предмет нестандартного поведения. "Дьявол в деталях!©"
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Гость
2015 Oct 16; 04:30 PM; Oakville, ON, Canada.

— Проверил команду, которая исследовалась первой. Проверял примитивно, т.е. создал соответствующую базу файлов и директорий понакопировав всякого разного учебного материала.

— Предложенный Azure вариант:

Код: (bash) [Выделить]
find ./ -type f -execdir rename -v 'y/:/_/' {} +
на моём учебном материале работает без нареканий, Ваш sergey113, вариант при определённых условиях тоже нормально работает, однако в некоторых случаях переименовываются и директории, если это не критично, то наверное можно и использовать, но нужно во всяком случае помнить что такое может быть :(

— Так сказать „эксцесс исполнителя“ :) я имею в виду терминальную команду.

==========================================

Azure, что касательно всей „коллекции“ , но она не очень благообразно выглядит :), ибо создавалась для внутреннего употребления, потому целесообразным буду считать выдачу частями и с пояснениями зачем мне это было нужно и чего я хотел добиться или для чего создавал или находил.

— Начинали мы с команды Find, думаю в этом ключе и будем продолжать:

— Начну с „безобидных“ относительно команд, команд поиска, вроде как при поиске ничего не должно удалиться и переписаться…
§1
Код: (bash) [Выделить]
find ./ -type f -exec grep -H 'SearchWord' '{}' \;— Поиск файлов содержащих „SearchWord“ в директории и поддерикториях, указывает имя файла и строчку где поисковый запрос.
§2
Код: (bash) [Выделить]
sudo find . -iname "*XXX*" -print— Наиболее общий поисковый запрос где „ХХХ“ часть имени файла.
§3
Код: (bash) [Выделить]
find . -iname "*tar.gz" -print0 | xargs -0 zgrep -i "СтрокаВФайлеИлиЕгоИмя"— Вот поиск в архиве ещё есть…

— Продолжу через некоторое время, после работы… 2015 Oct 16; 04:35 PM.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
  • grep имеет прекрасную опцию -r и с учетом что -H - стоит по умолчанию => превращаем Вашу команду в grep -r 'SearchWord' ./  без find
  • -print опять же по умолчанию, так что можно опустить и зачем sudo
  • аналогично первому zgrep -ir --include="*tar.gz" "СтрокаВФайлеИлиЕгоИмя" ./ опять без find
Зачем плодить сущности?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн sergey113

  • Автор темы
  • Забанен
  • Активист
  • *
  • Сообщений: 407
  • равновесие
    • Просмотр профиля
    • Недоделанный сайт :)
уже давно использую, и не только для двоеточия
tr \*\?\<\:\>\/\\ _
Вставил Вашу команду в терминал и она не работает. Надо ее или оформить нормально или може в ней вообще ошибка содержится.

Когда искал решение для своей задачи то видел упоминание про tr, но подумал что это костыль типа sed и для ее использования нужны будут дополнительные движения. Не стал ее изучать.
Сейчас гляну по пристальнее,  что она может.  Так как использование всего одной команды это конечно предпочтительнее.

Пользователь решил продолжить мысль [time]17 Октябрь 2015, 01:59:27[/time]:
Azure
Вы изменили мою команду и говорите, что она работает не правильно..  Все она правильно работает, только если меняете параметры команды find  от которых зависит выбор набора данных, то тогда это уже другая команда и надо думать, что она делает и проверять перед использованием в работе.
И Вам и  adawdp  - видели как оформлен первый пост?
Вот также оформляйте и свои будет больше толку, а так одна говорильня.
« Последнее редактирование: 17 Октября 2015, 01:04:21 от sergey113 »
ubuntu 14.04+firefox+virtualbox+windows=туда-сюда ::)
dell 1220-Core2Duo 2200МГц (T6670)-4Gb DDR2-800МГц-Intel GMA 4500MHD-ЗВУК Intel HDA-HTS725050A7E630

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Azure
Вы изменили мою команду и говорите, что она работает не правильно..  Все она правильно работает, только если меняете параметры команды find  от которых зависит выбор набора данных, то тогда это уже другая команда и надо думать, что она делает и проверять перед использованием в работе.
Подробнее можно?  В чём Вы нашли отличия «влияющие на набор данных», что это стала «другая команда»?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн sergey113

  • Автор темы
  • Забанен
  • Активист
  • *
  • Сообщений: 407
  • равновесие
    • Просмотр профиля
    • Недоделанный сайт :)
А что глаз нет? Или склерозом страдаете и не поните что в Вашей команде есть-name '*:*'
В моей нет этого параметра. Он и влияет на выбор папки у которой есть символ двоеточия.

2. На форуме ЗАПРЕЩЕНО

2.2. Оскорблять кого-либо или принижать его личные качества. Будьте вежливы и культурны!

+5% в копилку
pipe
« Последнее редактирование: 17 Октября 2015, 02:25:05 от pipe »
ubuntu 14.04+firefox+virtualbox+windows=туда-сюда ::)
dell 1220-Core2Duo 2200МГц (T6670)-4Gb DDR2-800МГц-Intel GMA 4500MHD-ЗВУК Intel HDA-HTS725050A7E630

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
в Вашей команде есть -name '*:*'
В моей нет этого параметра. Он и влияет на выбор папки у которой есть символ двоеточия.
Во первых данная опция влияет на выбор файлов, а не папок, т.к установлена опция -type f. Но самое важное, что уменьшение количества файлов в списке (все или только часть их) не влияет на команду их обработки. Убедитесь в этом удалив этот параметр из команды.
видели как оформлен первый пост?
Вот также оформляйте и свои будет больше толку, а так одна говорильня.
Красивое оформление не восполняет недостатка знаний.
« Последнее редактирование: 17 Октября 2015, 02:09:54 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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