Вот это
Массовое переименование (файлов)
Модератор: Bizdelnick
Re: Массовое переименование
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
А какую цель преследует создание этих переменных? Код не стал более читаемым, наоборот, появились переменные, назначение которых непонятно из их имён. Код не стало легче модифицировать, наоборот, для добавления ещё одного каталога надо внести изменения в двух местах вместо одного. Если бы у Вас был массив с каталогами, тогда другое дело, но массивов в POSIX shell нет.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
Также не следует определять кучу переменных в одной строке, как и вообще записывать в одну строку несколько операций, это ухудшает читаемость кода.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
Интересно...
...
Добавлено (02:58):
Разделение действий.
Добавлено (03:03):
...Эх..!Bizdelnick писал: ↑23.03.2023 18:57Код не стал более читаемым, наоборот, появились переменные, назначение которых непонятно из их имён. Код не стало легче модифицировать, наоборот, для добавления ещё одного каталога надо внести изменения в двух местах вместо одного.
...
Добавлено (03:08):
Если в POSIX shell массивов нет, тогда как быть? Скажите, пожалуйста.Bizdelnick писал: ↑23.03.2023 18:57Если бы у Вас был массив с каталогами, тогда другое дело, но массивов в POSIX shell нет.
Добавлено (03:10):
Ясно.Bizdelnick писал: ↑23.03.2023 18:57Также не следует определять кучу переменных в одной строке, как и вообще записывать в одну строку несколько операций, это ухудшает читаемость кода.
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
- Оставить как было.
- Использовать bash и массив
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
Лучше второй вариант конечно.
Re: Массовое переименование
Пока первый вариант без массива:
Код: Выделить всё
#!/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: Массовое переименование
Ужасно.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
Я бы вообще не использовал rename, так как его реализация разная в зависимости каким пакетом оно предоставляется. У меня в Gentoo эта команда входит в пакет util-linux и ключик -f в ней отсутствует...
Код: Выделить всё
#!/bin/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: Массовое переименование
prename её, как правило, называют во избежание путаницы.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
Ага глянул, есть такое. Только вот в Gentoo это пакет dev-perl/rename, и команда там perl-rename, тоже отличается название.
Re: Массовое переименование
Эх! А почему?
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Всё потому же. Вы вводите переменные, не задумываясь о том, для чего они нужны. Как правило, это делается, чтобы конкретные знания о том, с какими данными (в данном случае — каталогами) надо работать, были собраны в одном месте скрипта, а дальше можно было от них абстрагироваться. У Вас абстрагироваться не получилось: всё равно нужно знать если не пути к каталогам, то их число и соответствующие каждому имена переменных. Объём кода увеличился в разы, улучшений нет, значит, стало хуже.
Сравните с тем, что предложил ormorph: все каталоги собраны в одном массиве, кроме имени этого массива ничего знать не надо. Аналогично можно сделать и на POSIX shell с использованием переменной:
Код: Выделить всё
dirs='dos windows macos'
for dir in $dirs; do
# ...
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
Эх!Bizdelnick писал: ↑24.03.2023 19:10Всё потому же. Вы вводите переменные, не задумываясь о том, для чего они нужны. Как правило, это делается, чтобы конкретные знания о том, с какими данными (в данном случае — каталогами) надо работать, были собраны в одном месте скрипта, а дальше можно было от них абстрагироваться. У Вас абстрагироваться не получилось: всё равно нужно знать если не пути к каталогам, то их число и соответствующие каждому имена переменных. Объём кода увеличился в разы, улучшений нет, значит, стало хуже.
...
Понятно!
Спасибо за разъяснение!
Добавлено (19:25):
А! Ясно. Спасибо ещё раз!Bizdelnick писал: ↑24.03.2023 19:10Сравните с тем, что предложил ormorph: все каталоги собраны в одном массиве, кроме имени этого массива ничего знать не надо. Аналогично можно сделать и на POSIX shell с использованием переменной:
Re: Массовое переименование
Только такой способ не будет работать с именами каталогов, в которых содержатся пробелы. Так же это слабость выше приведённого мною скрипта. К счастью bash поддерживает синтаксис C, для оператора for. По этому можно скрипт просто переделать для работы с индексами массива. Элемент массива содержащий пробелы заключается в кавычки.Bizdelnick писал: ↑24.03.2023 19:10Аналогично можно сделать и на POSIX shell с использованием переменной:
- Bizdelnick
- Модератор
- Сообщения: 20793
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Есть такое, да. И не только пробелы, но и табуляции, переводы строки и прочие непотребства. Если помнить об этом и не использовать непотребные имена каталогов, проблем не будет. Если контролировать имена невозможно, то такой вариант, конечно, не годится.
Тут всё проще, достаточно исправить ${list[@]} на "${list[@]}".
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
Да это работает.