Переименовать – что означает “s//” и “y//”?

Вопрос или проблема

Страница man предоставляет два примера:

rename 's/\.bak$//' *.bak
rename 'y/A-Z/a-z/' *

Таким образом, это либо s, либо y, а затем /заменитьЭто/наЭто

Что означает ведущее s и y? Есть ли другие варианты?

В первом случае:

rename 's/\.bak$//' *.bak

вы применяете регулярное выражение к именам файлов и заменяете подходящую часть выражений (.bak в конце имени файла) на второе выражение (которое пустое).

Во втором случае:

rename 'y/A-Z/a-z/' *

вы сравниваете с паттерном регулярного выражения и транслитерируете в целевой. Другими словами, диапазон A-Z изменяется на диапазон a-z, что делает имена файлов строчными.

Я предлагаю вам взглянуть на страницу man для sed для получения дополнительных команд и подробностей. Я полагаю, что команда ‘s’ используется чаще всего. Также документация по regex (раздел 7) и perl может быть полезна. В частности, вот учебник по perl и регулярным выражениям.


Из man sed:

s/regexp/replacement/    
       Пытается сопоставить regexp с пространством шаблона. Если
       успешно, заменяет ту часть, которая была сопоставлена, на replacement.
       Замена может содержать специальный символ & для ссылки на ту
       часть пространства шаблона, которая совпала, и специальные
       экранирования \1 через \9 для обращения к соответствующим
       совпадающим подвыражениям в regexp.

y/source/dest/  
       Транслитерирует символы в пространстве шаблона, которые
       появляются в source, на соответствующий символ в dest.

Спасибо за вышеуказанное объяснение этой команды. Оно было достаточно полезным, чтобы я смог использовать rename для пакетной замены расширений у целой группы файлов. Я подумал, что будет полезно поделиться тем, что я узнал.

В этом примере у меня есть группа файлов со следующими именами:

test1.old
test2.old
test3.old

Я хочу изменить все расширения с “.old” на “.new”

(В этом примере файлы находятся на Рабочем столе)

Моя строка терминала выглядит следующим образом:

user@linuxsystem:~/Desktop$ rename 's/\.old$/.new/' *.old

В этом примере синтаксис выглядит следующим образом:

rename 's/\[ЗАМЕНИТЬ$]/[НОВЫЙ ТЕКСТ]/' [ЦЕЛЬ]

Таким образом, в этом случае,
ЗАМЕНИТЬ — это “.old”, НОВЫЙ ТЕКСТ — это “.new”, а ЦЕЛЬ — это “*.old”, что означает любой файл с расширением .old

Я понимаю, что написание в таком виде может показаться избыточным для опытных пользователей, но так как я не эксперт, мне часто хотелось бы, чтобы кто-то разбирал вещи таким образом, чтобы я мог следовать этому.

Еще раз спасибо за информацию! Я не смог бы разобраться в этом без поста выше!

Ответ или решение

Вопрос о различии между командами s// и y// в контексте утилиты rename в Linux требует детального объяснения. Эти команды основаны на мощных механизмах обработки строк, используемых в Perl и других языках программирования, и имеют свои уникальные назначения, что поможет в редактировании имен файлов в пакетном режиме.

Различия между s// и y//

  1. Команда s// (замена):

    • Формат: s/старое/новое/
    • Основное назначение: Заменяет первое вхождение определенного шаблона в строке на заданный текст.
    • Пример:
      rename 's/\.bak$//' *.bak

      В данном примере вы удаляете расширение .bak из всех файлов, заканчивающихся на это расширение. Регулярное выражение \.bak$ указывает, что следует искать .bak в конце имени файла, а пустая строка после слэша (//) означает, что найденный текст не будет заменён ни на что (просто удаляется).

  2. Команда y// (транслитерация):

    • Формат: y/исход/назначение/
    • Основное назначение: Преобразует одни символы в другие без использования регулярных выражений. Пара символов в исходной строке заменяются на соответствующие символы в строке назначения.
    • Пример:
      rename 'y/A-Z/a-z/' *

      В этом случае, все заглавные буквы в именах файлов будут преобразованы в строчные, что делает все файлы с именами, содержащими заглавные буквы, в более удобочитаемом формате.

Дополнительные опции и информация

Команды s и y представляют собой два основных типа обработки строк в контексте команды rename. Однако есть и другие варианты, которые вы можете использовать, включая:

  • m//: использование для проверки мачтей (matches), но данная функция не так часто применяется в контексте rename.

  • r//: может использоваться для замены на регулярных выражениях и возвращает результат без изменения исходной строки.

Для более углубленного изучения этих команд рекомендуется ознакомиться с документацией по sed и регулярным выражениям, а также справочными руководствами по Perl. Эти ресурсы дадут вам более полное представление о возможностях текстовой обработки в Unix-подобных системах.

Практическое применение

Вы также упомянули, как использовать команду rename для пакетного изменения расширений файлов. Ваш пример, где вы изменяете расширение файлов с .old на .new, является отличным иллюстративным случай. Вот как это выглядит в вашем примере:

user@linuxsystem:~/Desktop$ rename 's/\.old$/.new/' *.old

Таким образом, данный подход позволяет легко и быстро изменять расширения множества файлов с одинаковой структурой, что экономит время и усилия.

Заключение

Тем не менее, использование команд s// и y// в rename — это мощный инструмент для тех, кто работает с файлами в операционных системах на базе Unix/Linux. Глубокое понимание того, как работают эти команды, поможет вам более эффективно управлять файловыми системами и автоматизировать рутинные задачи. Если у вас есть дополнительные вопросы или необходима помощь по другим аспектам командной строки, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...