изменение нескольких имен файлов

#r #macos #terminal

#r #macos #терминал

Вопрос:

У меня есть папка с несколькими файлами с именем

автор — год издания — title.pdf например, «Hanahan Weinberg — Cell 2011 — Признаки рака следующего поколения.pdf».

Я хочу изменить их все на

журнал за год — author — title.pdf например, «2011 Cell — Ханахан Вайнберг — признаки рака следующего поколения.pdf»

Есть ли способ сделать это в Mac terminal или в R?

Спасибо

Ответ №1:

Мы можем изменить обратную ссылку после их захвата

 sub("^(\w )\s -\s (\w )\s (\w )(.*)", "\3 \2 - \1\4", str1)
#[1] "year journal - author - title.pdf"
 

данные

 str1 <- "author - journal year - title.pdf"
 

Ответ №2:

Для переименования файлов используйте rename инструмент командной строки:

 rename 's{ (.*?) s*-s* (.*?) s*-s* (.*) }{$2 - $1 - $3}x' *pdf
 

Регулярное выражение использует модификатор /x : игнорировать пробелы и комментарии для удобства чтения.
(.*?) s*-s* : любой символ, повторяющийся 0 или более раз, не жадный ( *? : соответствие минимальной длины), за которым следует пробел, повторяющийся 0 или более раз, буквенное тире и больше пробелов, повторяющихся 0 или более раз.


Утилита командной строки rename доступна во многих вариантах. Большинство из них должны работать для этой задачи. Я использовал rename версию 1.601 Аристотеля Пагальциса. Для установки rename просто загрузите его Perl-скрипт и поместите его в $PATH . Или установите rename с помощью conda , например, так:

 conda install rename
 

ПРИМЕР:

 # Create example input file:
touch 'Doe - 2021 - Foo bar.pdf'

# Dry run - just print, do not rename anything:
rename -n 's{ (.*?) s*-s* (.*?) s*-s* (.*) }{$2 - $1 - $3}x' *pdf

# Actuall rename:
rename 's{ (.*?) s*-s* (.*?) s*-s* (.*) }{$2 - $1 - $3}x' *pdf