Відповіді:
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/) }' *