Ответы:
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. Существует две распространенные версии этой команды, поэтому проверьте ее справочную страницу, чтобы узнать, какая у вас есть:
## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *
## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *
Если вы хотите использовать версию из util-linux-ng в системе Debian, она доступна под именем rename.ul
rename
в дикой природе существует несколько версий . Проверьте вашу местную rename
документацию, чтобы выяснить, как использовать вашу.
rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
Расширения параметров оболочки достаточно для простых преобразований, подобных этому. Подстановка команд менее эффективна из-за необходимости порождения дополнительных процессов (для самой подстановки команд и cut
/ sed
).
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
TestSR*
находит файлы, CL${f#TestSR}
будет новое имя. Материал после #
будет заменен из имени файла ( f
).
Вот один из способов:
ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
ls *.{h,m}
-> Найти все файлы с расширением .h или .mn=CL
-> Добавить префикс CL к имени файлаsed -e 's/^Test//'
-> Удаляет префикс теста из имени файлаmv $a $n
-> Выполняет переименованиеВы можете попробовать с:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
См. man bash
(Раздел «Расширение параметров») для получения подробной информации.
Ну, это было не так сложно, как я.
$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
for f in TestSR*.[mh]
, for f in TestSR*.{m,h}
, for f in TestSR*.m TestSR*.h
.
Если вам нужно что-то более прелюбодейное, вы можете сделать это
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *