Как я могу массово заменить префикс для многих файлов?
У меня много файлов вроде
- TestSRConnectionContext.h
- TestSRConnectionContext.m
Я хотел бы изменить все их на
- CLConnectionContext.h
- CLConnectionContext.m
Как бы я это сделал?
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
Это использует подстановку команды bash, чтобы удалить первые 6 символов из имени входного файла с помощью cut
, добавляет CL
к результату и сохраняет его в $newname
. Затем оно переименовывает старое имя в новое. Это выполняется для каждого файла.
cut -c7-
указывает, что только символы после индекса 7 должны быть возвращены из ввода. 7-
диапазон, начинающийся с индекса 7 без конца; то есть до конца строки.
Ранее я использовал cut -b7-
, но -c
вместо этого должен был использоваться для обработки кодировок символов, которые могут иметь несколько байтов на символ, например UTF-8.
Я бы сказал, что проще всего просто использовать
rename
команду, которая распространена во многих дистрибутивах Linux. Существует две распространенные версии этой команды, поэтому проверьте ее справочную страницу, чтобы узнать, какая у вас есть:Если вы хотите использовать версию из util-linux-ng в системе Debian, она доступна под именем
rename.ul
источник
rename
в дикой природе существует несколько версий . Проверьте вашу местнуюrename
документацию, чтобы выяснить, как использовать вашу.rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
Расширения параметров оболочки достаточно для простых преобразований, подобных этому. Подстановка команд менее эффективна из-за необходимости порождения дополнительных процессов (для самой подстановки команд и
cut
/sed
).источник
TestSR*
находит файлы,CL${f#TestSR}
будет новое имя. Материал после#
будет заменен из имени файла (f
).Вот один из способов:
ls *.{h,m}
-> Найти все файлы с расширением .h или .mn=CL
-> Добавить префикс CL к имени файлаsed -e 's/^Test//'
-> Удаляет префикс теста из имени файлаmv $a $n
-> Выполняет переименованиеисточник
Вы можете попробовать с:
См.
man bash
(Раздел «Расширение параметров») для получения подробной информации.источник
Ну, это было не так сложно, как я.
источник
for f in TestSR*.[mh]
,for f in TestSR*.{m,h}
,for f in TestSR*.m TestSR*.h
.Если вам нужно что-то более прелюбодейное, вы можете сделать это
источник