Массовое переименование (файлов)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
UnixNoob
Сообщения: 1379
ОС: Slackware

Re: Массовое переименование

Сообщение UnixNoob »

MiK13 писал:
23.03.2023 12:09
А что за программа fd?
Вот это
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

igor@igor писал:
23.03.2023 04:16

Код: Выделить всё

z='src/*.cpp' ; a='dos/' ; b='windows/' ; c='linux/' ; d='macos/'

for f in $a$z $b$z $c$z $d$z; do
А какую цель преследует создание этих переменных? Код не стал более читаемым, наоборот, появились переменные, назначение которых непонятно из их имён. Код не стало легче модифицировать, наоборот, для добавления ещё одного каталога надо внести изменения в двух местах вместо одного. Если бы у Вас был массив с каталогами, тогда другое дело, но массивов в POSIX shell нет.
Также не следует определять кучу переменных в одной строке, как и вообще записывать в одну строку несколько операций, это ухудшает читаемость кода.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Массовое переименование

Сообщение igor@igor »

UnixNoob писал:
23.03.2023 12:52
Вот это
Интересно...
...
Добавлено (02:58):
Bizdelnick писал:
23.03.2023 18:57
А какую цель преследует создание этих переменных?
Разделение действий.
Добавлено (03:03):
Bizdelnick писал:
23.03.2023 18:57
Код не стал более читаемым, наоборот, появились переменные, назначение которых непонятно из их имён. Код не стало легче модифицировать, наоборот, для добавления ещё одного каталога надо внести изменения в двух местах вместо одного.
...Эх..!
...
Добавлено (03:08):
Bizdelnick писал:
23.03.2023 18:57
Если бы у Вас был массив с каталогами, тогда другое дело, но массивов в POSIX shell нет.
Если в POSIX shell массивов нет, тогда как быть? Скажите, пожалуйста.
Добавлено (03:10):
Bizdelnick писал:
23.03.2023 18:57
Также не следует определять кучу переменных в одной строке, как и вообще записывать в одну строку несколько операций, это ухудшает читаемость кода.
Ясно.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

igor@igor писал:
24.03.2023 02:51
Если в POSIX shell массивов нет, тогда как быть?
  1. Оставить как было.
  2. Использовать bash и массив
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Массовое переименование

Сообщение igor@igor »

Bizdelnick писал:
24.03.2023 03:15
1. Оставить как было.
2. Использовать bash и массив
Лучше второй вариант конечно.
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Массовое переименование

Сообщение igor@igor »

Пока первый вариант без массива:

Код: Выделить всё

#!/bin/sh
#2023xxxx Ver. 2. Скрипт: rename22.sh для изменения расширений.

polovina_puti='src/*.cpp'

p="${polovina_puti}"

polovina_puti_1='dos/'

p_1="${polovina_puti_1}"

polovina_puti_2='windows/'

p_2="${polovina_puti_2}"

polovina_puti_3='linux/'

p_3="${polovina_puti_3}"

polovina_puti_4='macos/'

p_4="${polovina_puti_4}"

rename -f 's/\.cpp$/.txt/' $p_1$p $p_2$p $p_3$p $p_4$p

Добавлено (10:14):
Скажите, пожалуйста: уже лучше?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

Ужасно.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Массовое переименование

Сообщение ormorph »

igor@igor писал:
24.03.2023 10:05
Скажите, пожалуйста: уже лучше?
Я бы вообще не использовал rename, так как его реализация разная в зависимости каким пакетом оно предоставляется. У меня в Gentoo эта команда входит в пакет util-linux и ключик -f в ней отсутствует...

Код: Выделить всё

#!/bin/sh
Обычно используется если используется строго синтаксис Burn Shell. Если используется расширенный синтаксис, например Bash, то следует указывать bash, а не sh.
Для bash можно так с использованием mv:

Код: Выделить всё

#!/bin/bash

list=( src dos windows macos )

for dir in ${list[@]}
do
	pushd "${dir}" >/dev/null
		for file in *.cpp
		do
			[ -f "${file}" ] && mv -f "${file}" "${file%.cpp}.txt"
		done
	popd >/dev/null
done
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

ormorph писал(а):
24.03.2023 17:10
его реализация разная в зависимости каким пакетом оно предоставляется
prename её, как правило, называют во избежание путаницы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Массовое переименование

Сообщение ormorph »

Bizdelnick писал:
24.03.2023 17:35
prename её, как правило, называют во избежание путаницы.
Ага глянул, есть такое. Только вот в Gentoo это пакет dev-perl/rename, и команда там perl-rename, тоже отличается название.
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Массовое переименование

Сообщение igor@igor »

Bizdelnick писал:
24.03.2023 14:08
Ужасно
Эх! А почему?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

igor@igor писал:
24.03.2023 18:58
А почему?
Всё потому же. Вы вводите переменные, не задумываясь о том, для чего они нужны. Как правило, это делается, чтобы конкретные знания о том, с какими данными (в данном случае — каталогами) надо работать, были собраны в одном месте скрипта, а дальше можно было от них абстрагироваться. У Вас абстрагироваться не получилось: всё равно нужно знать если не пути к каталогам, то их число и соответствующие каждому имена переменных. Объём кода увеличился в разы, улучшений нет, значит, стало хуже.
Сравните с тем, что предложил ormorph: все каталоги собраны в одном массиве, кроме имени этого массива ничего знать не надо. Аналогично можно сделать и на POSIX shell с использованием переменной:

Код: Выделить всё

dirs='dos windows macos'

for dir in $dirs; do
# ...
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

Re: Массовое переименование

Сообщение igor@igor »

Bizdelnick писал:
24.03.2023 19:10
Всё потому же. Вы вводите переменные, не задумываясь о том, для чего они нужны. Как правило, это делается, чтобы конкретные знания о том, с какими данными (в данном случае — каталогами) надо работать, были собраны в одном месте скрипта, а дальше можно было от них абстрагироваться. У Вас абстрагироваться не получилось: всё равно нужно знать если не пути к каталогам, то их число и соответствующие каждому имена переменных. Объём кода увеличился в разы, улучшений нет, значит, стало хуже.
Эх!
...
Понятно!
Спасибо за разъяснение!
Добавлено (19:25):
Bizdelnick писал:
24.03.2023 19:10
Сравните с тем, что предложил ormorph: все каталоги собраны в одном массиве, кроме имени этого массива ничего знать не надо. Аналогично можно сделать и на POSIX shell с использованием переменной:
А! Ясно. Спасибо ещё раз!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Массовое переименование

Сообщение ormorph »

Bizdelnick писал:
24.03.2023 19:10
Аналогично можно сделать и на POSIX shell с использованием переменной:
Только такой способ не будет работать с именами каталогов, в которых содержатся пробелы. Так же это слабость выше приведённого мною скрипта. К счастью bash поддерживает синтаксис C, для оператора for. По этому можно скрипт просто переделать для работы с индексами массива. Элемент массива содержащий пробелы заключается в кавычки.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Массовое переименование

Сообщение Bizdelnick »

ormorph писал(а):
24.03.2023 21:47
Только такой способ не будет работать с именами каталогов, в которых содержатся пробелы.
Есть такое, да. И не только пробелы, но и табуляции, переводы строки и прочие непотребства. Если помнить об этом и не использовать непотребные имена каталогов, проблем не будет. Если контролировать имена невозможно, то такой вариант, конечно, не годится.
ormorph писал(а):
24.03.2023 21:47
Так же это слабость выше приведённого мною скрипта. К счастью bash поддерживает синтаксис C, для оператора for. По этому можно скрипт просто переделать для работы с индексами массива.
Тут всё проще, достаточно исправить ${list[@]} на "${list[@]}".
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Массовое переименование

Сообщение ormorph »

Bizdelnick писал:
24.03.2023 21:52
Тут всё проще, достаточно исправить ${list[@]} на "${list[@]}".
Да это работает.
Спасибо сказали:
Ответить