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

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

Модератор: Bizdelnick

igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Всем привет!
Есть исходники в каталоге, например, dos/src
В каталоге файлы с расширением .cpp
Перехожу в каталог dos/src
Делаю
rename -f 's/.cpp/.txt/' *.cpp
Т.о. переименовываю файлы : *.cpp -> *.txt

Вопрос: как без перехода в каталог изменить расширение файлов?
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1379
ОС: Slackware

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

Сообщение UnixNoob »

find использовать или его аналоги (fd, к примеру), возможно с bash можно что-то придумать и тем же mv.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

Точно так же. Только в регулярке нужно всегда экранировать точку и использовать привязку к концу строки.
rename -f 's/\.cpp$/.txt/' dos/src/*.cpp
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

UnixNoob писал:
21.03.2023 01:12
find использовать или его аналоги (fd, к примеру), возможно с bash можно что-то придумать и тем же mv.
Cпасибо! Попробую чего-нибудь "запилить"...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

Или чисто стандартными средствами:

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

for f in dos/src/*.cpp; do
    dir=$(dirname "$f")
    base=$(basename "$f" .cpp)
    mv -f "$f" "${dir}/${base}.txt"
done
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
21.03.2023 01:26
Точно так же. Только в регулярке нужно всегда экранировать точку и использовать привязку к концу строки.
rename -f 's/\.cpp$/.txt/' dos/src/*.cpp
Спасибо!
...
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
21.03.2023 01:31
Или чисто стандартными средствами:

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

for f in dos/src/*.cpp; do
    dir=$(dirname "$f")
    base=$(basename "$f" .cpp)
    mv -f "$f" "${dir}/${base}.txt"
done
Благодарю!
...
Добавлено (02:19):
Оба варианта работают. Класс! Ещё раз спасибо!
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Завернул в скрипты..:
rename1.bash

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

#!/bin/bash
#2023xxxx Ver. 0. Скрипт: rename1.bash для изиенения расширений...
# shellcheck disable=SC2034  # Unused variables left for readability

rename -f 's/\.cpp$/.txt/' dos/src/*.cpp windows/src/*.cpp linux/src/*.cpp macos/src/*.cpp

rename2.bash

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

#!/bin/bash
#2023xxxx Ver. 0. Скрипт: rename2.bash для изиенения расширений...

for f in dos/src/*.cpp windows/src/*.cpp linux/src/*.cpp macos/src/*.cpp; do
    dir=$(dirname "$f")
    base=$(basename "$f" .cpp)
    mv -f "$f" "${dir}/${base}.txt"
done

Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Скажите, пожалуйста: скрипты rename1.bash ; rename2.bash
можно как-нибудь улучшить?
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Это хорошо когда четыре каталога. А если каталогов 10-20, например...
...
Вот почему я и задался вопросом оптимизации скрипта...
...
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

"Вангую")
На переменных нужно...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

igor@igor писал:
21.03.2023 19:32
Скажите, пожалуйста: скрипты rename1.bash ; rename2.bash
можно как-нибудь улучшить?
Для этого неплохо бы понимать, на фига они вообще нужны.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
22.03.2023 00:51
Для этого неплохо бы понимать, на фига они вообще нужны.
Как это? Нужны переименования файлов:
*.cpp -> *.txt
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

igor@igor писал:
22.03.2023 02:16
Как это? Нужны переименования файлов:
*.cpp -> *.txt
Скрипты с этим прекрасно справятся. Может быть, улучшить что-то и можно, но для этого надо понимать, зачем понадобилось переименовывать файлы, и что это вообще за файлы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
22.03.2023 02:23
Скрипты с этим прекрасно справятся. Может быть, улучшить что-то и можно, но для этого надо понимать, зачем понадобилось переименовывать файлы, и что это вообще за файлы.
Так интересно в улучшении скриптов потренироваться... Иногда, нет компиляторов никаких, а только текстовые редакторы... Я ещё и кодировку выправляю, чтобы наверняка без "каракулей" открыть... Понятно, что можно исходники любым текстовым редактором открыть... Вообще, Никсы и БСД ветки всё "хавают" без проблем! А вот всякие Винды ...
Поэтому я заморочился с переименовыванием и перекодировкой файлов...
...
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1379
ОС: Slackware

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

Сообщение UnixNoob »

igor@igor писал:
22.03.2023 03:48
А вот всякие Винды ...
Под "всякие Винды" есть как минимум Notepad++, а так ставь хоть Emacs, хоть Vim,VSCode и т.д.
Ваша задача не понятная, зачем cpp в txt переводить.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

igor@igor писал:
22.03.2023 03:48
Так интересно в улучшении скриптов потренироваться...
Нет объективного критерия, чтобы понять, какой скрипт лучше. Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh. Но в Google, например, наоборот принципиально используют только bash для единообразия, поскольку он более продвинут, и более сложные вещи на нём реализовать легче.
igor@igor писал:
22.03.2023 03:48
Иногда, нет компиляторов никаких, а только текстовые редакторы...
И что? Они не могут открыть файл с суффиксом .cpp, что ли?
igor@igor писал:
22.03.2023 03:48
Я ещё и кодировку выправляю, чтобы наверняка без "каракулей" открыть...
А я Вам уже писал: не используйте в исходниках кириллицу, и не будет проблем с кодировкой. Нужно текстовое пояснение на русском — ну напишите README и положите его рядом. Можно сразу в нескольких вариантах с разными кодировками.
igor@igor писал:
22.03.2023 03:48
А вот всякие Винды ...
Поэтому я заморочился с переименовыванием и перекодировкой файлов...
Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального. Пишите на powershell тогда уж.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

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

Сообщение devilr »

Bizdelnick писал:
22.03.2023 13:19
Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального.
rename есть точно.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

devilr писал:
22.03.2023 13:33
rename есть точно.
Ну это же не Perl rename. ☺
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

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

Сообщение devilr »

Bizdelnick писал:
22.03.2023 13:46
Ну это же не Perl rename.
Однако без перла ей как-то в виндах переименовывали. Даже массово. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

UnixNoob писал:
22.03.2023 12:57
Под "всякие Винды" есть как минимум Notepad++, а так ставь хоть Emacs, хоть Vim,VSCode и т.д.
Да есть...
...
Добавлено (16:23):
UnixNoob писал:
22.03.2023 12:57
Ваша задача не понятная, зачем cpp в txt переводить.
Интересно...
...
Добавлено (16:26):
Bizdelnick писал:
22.03.2023 13:19
Нет объективного критерия, чтобы понять, какой скрипт лучше. Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh. Но в Google, например, наоборот принципиально используют только bash для единообразия, поскольку он более продвинут, и более сложные вещи на нём реализовать легче.
Понятно...
...
Добавлено (16:31):
Bizdelnick писал:
22.03.2023 13:19
И что? Они не могут открыть файл с суффиксом .cpp, что ли?
Могут конечно...
...
Добавлено (16:41):
Bizdelnick писал:
22.03.2023 13:19
А я Вам уже писал: не используйте в исходниках кириллицу, и не будет проблем с кодировкой. Нужно текстовое пояснение на русском — ну напишите README и положите его рядом. Можно сразу в нескольких вариантах с разными кодировками.
Да, писали. И про ASCII кодировку тоже писали. Хорошая идея про файл README
Спасибо!
Добавлено (17:26):
Bizdelnick писал:
22.03.2023 13:19
Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального. Пишите на powershell тогда уж.
Нет. Под винды не пишу...
...
Добавлено (17:31):
devilr писал:
22.03.2023 13:33
rename есть точно.
А толку...
...
Добавлено (17:48):
Bizdelnick писал:
22.03.2023 13:46
Ну это же не Perl rename. ☺
:)
Добавлено (18:05):
devilr писал:
22.03.2023 14:13
Однако без перла ей как-то в виндах переименовывали. Даже массово. :)
Вот это да. Чудеса! :)
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Новая версия скрипта rename11.sh

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

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

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

rename -f 's/\.cpp$/.txt/' $a$p $b$p $c$p $d$p

Добавлено (22:08):
Всё хорошо скрипт rename11.sh переименовывает: *.cpp -> *.txt
Только есть нюанс:
shellcheck rename11.sh
v.png
v.png (82.53 КБ) 1257 просмотров
Я вики читал, но не исправил((((
Как быть?
Помогите, пожалуйста.
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1379
ОС: Slackware

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

Сообщение UnixNoob »

Bizdelnick писал:
22.03.2023 13:19
Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh
А почему не так?

Shell

#!/usr/bin/env sh
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Такая же ругань(((((((((((
...
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Не осилил(((
Как быть?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

UnixNoob писал:
22.03.2023 22:31
А почему не так?

Shell

#!/usr/bin/env sh
Это лишено смысла, по стандарту шелл лежит в /bin/sh (то есть положиться на это можно не в меньшей мере, чем на то, что в системе есть /usr/bin/env). Вот с bash смысл может быть, например, в FreeBSD он находится в /usr/local/bin/bash (если вообще установлен, конечно).
Добавлено (01:21):
igor@igor писал:
22.03.2023 21:09
Я вики читал, но не исправил((((
И не надо исправлять. Вам же как раз и требуется globbing в данном случае. К предупреждениям любых анализаторов следует относиться критически.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
23.03.2023 01:18
И не надо исправлять. Вам же как раз и требуется globbing в данном случае. К предупреждениям любых анализаторов следует относиться критически.
А понятно. Спасибо!
Я уж и думаю: в таком простом скрипте по другому никак не сделать...
...
Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Чисто! Класс!
shellcheck rename22.sh

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

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

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

for f in $a$z $b$z $c$z $d$z; do
    dir=$(dirname "$f")
    base=$(basename "$f" .cpp)
    mv -f "$f" "${dir}/${base}.txt"
done

Спасибо сказали:
igor@igor
Сообщения: 1374
ОС: Debian GNU/Linux, wheezy-amd64

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

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

Bizdelnick писал:
23.03.2023 01:18
Это лишено смысла, по стандарту шелл лежит в /bin/sh. Вот с bash смысл может быть, например, в FreeBSD он находится в /usr/local/bin/bash (если вообще установлен, конечно).
Тем более, /bin/sh - трушный / правильный шелл! Я его во всех своих (пусть даже и примитивных, надеюсь, что пока) скриптах использую... Чёрт меня дёрнул /bin/bash шелл использовать (пошло от какого-то примера по скрипту). Тем более, задачи лёгкие...
...
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

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

Сообщение MiK13 »

UnixNoob писал:
21.03.2023 01:12
find использовать или его аналоги (fd, к примеру)
А что за программа fd?
Я попробовал её -- система попросила установить пакет fdclone:. Поставил. Запустил fd -- похоже на какой-то файловый менеджер, причём некорректно работающий с русскими именами (считает по байтам, а не по знакам). Да ещё и в интерфейсе смесь английского и японского языков.
Спасибо сказали:
Ответить