Масове перейменування, зміна префікса


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, я отримав це зараз і сам. Позначення як відповідь. Thx
ErikTJ

Це прекрасно працює, дякую. Чи можете ви пояснити, що робить -b7-? Це посилання на список байтів? ss64.com/bash/cut.html
змінено

@imjared Оновив відповідь більш детально.
mrb

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).
Flash Thunder

32

Розширення параметрів оболонки достатньо для таких простих перетворень. Заміна команд менш ефективна через необхідність породити додаткові процеси (для самої підстановки команди та 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.
мрб

1

Якщо вам потрібно щось більш спритне, ви можете це зробити

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