Массовое переименование (файлов)
Модератор: Bizdelnick
Массовое переименование
Всем привет!
Есть исходники в каталоге, например, dos/src
В каталоге файлы с расширением .cpp
Перехожу в каталог dos/src
Делаю
rename -f 's/.cpp/.txt/' *.cpp
Т.о. переименовываю файлы : *.cpp -> *.txt
Вопрос: как без перехода в каталог изменить расширение файлов?
Есть исходники в каталоге, например, dos/src
В каталоге файлы с расширением .cpp
Перехожу в каталог dos/src
Делаю
rename -f 's/.cpp/.txt/' *.cpp
Т.о. переименовываю файлы : *.cpp -> *.txt
Вопрос: как без перехода в каталог изменить расширение файлов?
Re: Массовое переименование
find использовать или его аналоги (fd, к примеру), возможно с bash можно что-то придумать и тем же mv.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Точно так же. Только в регулярке нужно всегда экранировать точку и использовать привязку к концу строки.
rename -f 's/\.cpp$/.txt/' dos/src/*.cpp
rename -f 's/\.cpp$/.txt/' dos/src/*.cpp
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Или чисто стандартными средствами:
Код: Выделить всё
for f in dos/src/*.cpp; do
dir=$(dirname "$f")
base=$(basename "$f" .cpp)
mv -f "$f" "${dir}/${base}.txt"
done
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
Спасибо!Bizdelnick писал: ↑21.03.2023 01:26Точно так же. Только в регулярке нужно всегда экранировать точку и использовать привязку к концу строки.
rename -f 's/\.cpp$/.txt/' dos/src/*.cpp
...
Re: Массовое переименование
Благодарю!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):
Оба варианта работают. Класс! Ещё раз спасибо!Re: Массовое переименование
Завернул в скрипты..:
rename1.bash
rename2.bash
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
Код: Выделить всё
#!/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
Re: Массовое переименование
Скажите, пожалуйста: скрипты rename1.bash ; rename2.bash
можно как-нибудь улучшить?
можно как-нибудь улучшить?
Re: Массовое переименование
Это хорошо когда четыре каталога. А если каталогов 10-20, например...
...
Вот почему я и задался вопросом оптимизации скрипта...
...
...
Вот почему я и задался вопросом оптимизации скрипта...
...
Re: Массовое переименование
"Вангую")
На переменных нужно...
На переменных нужно...
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Для этого неплохо бы понимать, на фига они вообще нужны.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
Как это? Нужны переименования файлов:
*.cpp -> *.txt
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Скрипты с этим прекрасно справятся. Может быть, улучшить что-то и можно, но для этого надо понимать, зачем понадобилось переименовывать файлы, и что это вообще за файлы.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
Так интересно в улучшении скриптов потренироваться... Иногда, нет компиляторов никаких, а только текстовые редакторы... Я ещё и кодировку выправляю, чтобы наверняка без "каракулей" открыть... Понятно, что можно исходники любым текстовым редактором открыть... Вообще, Никсы и БСД ветки всё "хавают" без проблем! А вот всякие Винды ...Bizdelnick писал: ↑22.03.2023 02:23Скрипты с этим прекрасно справятся. Может быть, улучшить что-то и можно, но для этого надо понимать, зачем понадобилось переименовывать файлы, и что это вообще за файлы.
Поэтому я заморочился с переименовыванием и перекодировкой файлов...
...
Re: Массовое переименование
Под "всякие Винды" есть как минимум Notepad++, а так ставь хоть Emacs, хоть Vim,VSCode и т.д.
Ваша задача не понятная, зачем cpp в txt переводить.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Нет объективного критерия, чтобы понять, какой скрипт лучше. Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh. Но в Google, например, наоборот принципиально используют только bash для единообразия, поскольку он более продвинут, и более сложные вещи на нём реализовать легче.
И что? Они не могут открыть файл с суффиксом .cpp, что ли?
А я Вам уже писал: не используйте в исходниках кириллицу, и не будет проблем с кодировкой. Нужно текстовое пояснение на русском — ну напишите README и положите его рядом. Можно сразу в нескольких вариантах с разными кодировками.
Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального. Пишите на powershell тогда уж.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
rename есть точно.Bizdelnick писал: ↑22.03.2023 13:19Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Массовое переименование
Однако без перла ей как-то в виндах переименовывали. Даже массово.
Re: Массовое переименование
Да есть...
...
Добавлено (16:23):
Интересно...
...
Добавлено (16:26):
Понятно...Bizdelnick писал: ↑22.03.2023 13:19Нет объективного критерия, чтобы понять, какой скрипт лучше. Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh. Но в Google, например, наоборот принципиально используют только bash для единообразия, поскольку он более продвинут, и более сложные вещи на нём реализовать легче.
...
Добавлено (16:31):
Могут конечно...
...
Добавлено (16:41):
Да, писали. И про ASCII кодировку тоже писали. Хорошая идея про файл READMEBizdelnick писал: ↑22.03.2023 13:19А я Вам уже писал: не используйте в исходниках кириллицу, и не будет проблем с кодировкой. Нужно текстовое пояснение на русском — ну напишите README и положите его рядом. Можно сразу в нескольких вариантах с разными кодировками.
Спасибо!
Добавлено (17:26):
Нет. Под винды не пишу...Bizdelnick писал: ↑22.03.2023 13:19Во всяких виндах, как правило, нет ни bash, ни sh, ни rename, ни всего остального. Пишите на powershell тогда уж.
...
Добавлено (17:31):
А толку...
...
Добавлено (17:48):
Добавлено (18:05):
Вот это да. Чудеса!
Re: Массовое переименование
Новая версия скрипта rename11.sh
Только есть нюанс:
shellcheck 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 Я вики читал, но не исправил((((
Как быть?
Помогите, пожалуйста.
Re: Массовое переименование
А почему не так?Bizdelnick писал: ↑22.03.2023 13:19Хотите улучшить переносимость, например, — замените шебанг на #!/bin/sh
Shell
#!/usr/bin/env sh
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Re: Массовое переименование
Такая же ругань(((((((((((
...
...
Re: Массовое переименование
Не осилил(((
Как быть?
Как быть?
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Массовое переименование
Это лишено смысла, по стандарту шелл лежит в /bin/sh (то есть положиться на это можно не в меньшей мере, чем на то, что в системе есть /usr/bin/env). Вот с bash смысл может быть, например, в FreeBSD он находится в /usr/local/bin/bash (если вообще установлен, конечно).
Добавлено (01:21):
И не надо исправлять. Вам же как раз и требуется globbing в данном случае. К предупреждениям любых анализаторов следует относиться критически.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Массовое переименование
А понятно. Спасибо!Bizdelnick писал: ↑23.03.2023 01:18И не надо исправлять. Вам же как раз и требуется globbing в данном случае. К предупреждениям любых анализаторов следует относиться критически.
Я уж и думаю: в таком простом скрипте по другому никак не сделать...
...
Re: Массовое переименование
Чисто! Класс!
shellcheck rename22.sh
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
Re: Массовое переименование
Тем более, /bin/sh - трушный / правильный шелл! Я его во всех своих (пусть даже и примитивных, надеюсь, что пока) скриптах использую... Чёрт меня дёрнул /bin/bash шелл использовать (пошло от какого-то примера по скрипту). Тем более, задачи лёгкие...Bizdelnick писал: ↑23.03.2023 01:18Это лишено смысла, по стандарту шелл лежит в /bin/sh. Вот с bash смысл может быть, например, в FreeBSD он находится в /usr/local/bin/bash (если вообще установлен, конечно).
...
Re: Массовое переименование
А что за программа fd?
Я попробовал её -- система попросила установить пакет fdclone:. Поставил. Запустил fd -- похоже на какой-то файловый менеджер, причём некорректно работающий с русскими именами (считает по байтам, а не по знакам). Да ещё и в интерфейсе смесь английского и японского языков.