Массовое переименование, изменение префикса


53

Как я могу массово заменить префикс для многих файлов?

У меня много файлов вроде

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Я хотел бы изменить все их на

  • CLConnectionContext.h
  • CLConnectionContext.m

Как бы я это сделал?

Ответы:


38
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.


Спасибо, я получил это прямо сейчас тоже. Маркировка как ответ. Thx
ErikTJ

Это работает хорошо, спасибо. Можете ли вы объяснить, что делает -b7-? Это ссылка на список байтов? ss64.com/bash/cut.html
imjared

@imjared Обновлен ответ с более подробной информацией.
МРБ

56

Я бы сказал, что проще всего просто использовать 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


7
Предостережение: renameв дикой природе существует несколько версий . Проверьте вашу местную renameдокументацию, чтобы выяснить, как использовать вашу.
jw013

Чтобы удалить псевдоним сделатьrename TestSR '' *
Bsienn

хм ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Вспышка грома

33

Расширения параметров оболочки достаточно для простых преобразований, подобных этому. Подстановка команд менее эффективна из-за необходимости порождения дополнительных процессов (для самой подстановки команд и cut/ sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

Пояснение: TestSR*находит файлы, CL${f#TestSR}будет новое имя. Материал после #будет заменен из имени файла ( f).
Джо Эйферт

4

Вот один из способов:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> Найти все файлы с расширением .h или .m
  • n=CL -> Добавить префикс CL к имени файла
  • sed -e 's/^Test//' -> Удаляет префикс теста из имени файла
  • mv $a $n -> Выполняет переименование

3

Вы можете попробовать с:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

См. man bash(Раздел «Расширение параметров») для получения подробной информации.


1

Ну, это было не так сложно, как я.

$ 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;

1
В случае, если это поможет в будущем, вам не нужно повторять команды для двух шаблонов; Вы можете использовать (например): for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb

1

Если вам нужно что-то более прелюбодейное, вы можете сделать это

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.