Массовое переименование файлов в специальном формате

Я хочу переименовать несколько сотен файлов, имена которых отформатированы следующим образом:

A Study in Scarlet - Arthur Conan Doyle.mobi
Anvil of Stars - Greg Bear.mobi
City and the Stars, The - Arthur C. Clarke.mobi

После переименования я хочу достичь этой схемы именования:

Arthur Conan Doyle - A Study in Scarlett.mobi
Greg Bear - Avil of Stars.mobi
Arthur C. Clarke - City and the Stars, The.mobi

Бонусом будет удалите все неправильные символы из имени, например:

  1. _ [подчеркивание], чтобы заменить пустым
  2. %20, чтобы заменить пустым
  3. [] заменить на округлые ()
1
задан 15 May 2016 в 07:44

2 ответа

Я записал маленький сценарий удара, чтобы сделать задание.

#!/bin/bash

# Variables
extension='mobi'
report='report.log'    

if [ -f $report ];
then
    rm -rf $report
fi

echo  

Создают .bsh файл в каталоге, в котором Ваши .mobi файлы хранятся и вставляют вышеупомянутый код:

Открывают Terminal с Ctrl + Высокий звук + T и перешли к каталогу, в котором хранится Ваш сценарий:

cd /path/to/directory/

Для изменения полномочий сценария:

chmod +x <filename>.bsh

Для выполнения сценария:

bash <filename>.bsh

по некоторым причинам mv сбои при получении ошибки 'Script FAILED', иначе Вы доберетесь 'Script SUCCESSFUL'.

<час>

Объяснение

tr '_' ' ' символы нижнего подчеркивания замены с пробелом

tr '%20' ' ' замена %20 с пробелом

tr '[]' '()' квадратные скобки замены с круглыми скобками

tr -s ' ' замена несколько пробелов с одним

sed 's/\.[^.]*$//' извлечения только название файла без расширения

${string#?} удаляет первый символ строки

${string%?}, удаляют последний знак строки

mv -v, это покажет в терминале, какие файлы перемещаются. -v обозначает подробный.

tee -a changelog.log значением по умолчанию tee команда читает из стандартного входа и записей к стандартному выводу и файлам. -a обозначает, добавляют.

if [ $? -ne 0 ] проверки, если предыдущая команда была успешна.

report.log хранилища предыдущее и последнее название каждого файла.

<час>

Примечание

сценарий предполагает, что имя файла содержит только одного тире -

renaming files . . .\n' for filename in *.$extension do temp=$(echo $filename | tr '_' ' ' | tr '%20' ' ' | tr '[]' '()' | tr -s ' ' | sed 's/\.[^.]*$//' ) part1=$(echo $temp | cut -f1 -d-) part2=$(echo $temp | cut -f2 -d-) new_filename=$(echo "${part2#?} - ${part1%?}.$extension") echo $(mv -v "$filename" "$new_filename") | tee -a $report if [ $? -ne 0 ]; then echo

Создают .bsh файл в каталоге, в котором Ваши .mobi файлы хранятся и вставляют вышеупомянутый код:

Открывают Terminal с Ctrl + Высокий звук + T и перешли к каталогу, в котором хранится Ваш сценарий:

cd /path/to/directory/

Для изменения полномочий сценария:

chmod +x <filename>.bsh

Для выполнения сценария:

bash <filename>.bsh

по некоторым причинам mv сбои при получении ошибки 'Script FAILED', иначе Вы доберетесь 'Script SUCCESSFUL'.

<час>

Объяснение

tr '_' ' ' символы нижнего подчеркивания замены с пробелом

tr '%20' ' ' замена %20 с пробелом

tr '[]' '()' квадратные скобки замены с круглыми скобками

tr -s ' ' замена несколько пробелов с одним

sed 's/\.[^.]*$//' извлечения только название файла без расширения

${string#?} удаляет первый символ строки

${string%?}, удаляют последний знак строки

mv -v, это покажет в терминале, какие файлы перемещаются. -v обозначает подробный.

tee -a changelog.log значением по умолчанию tee команда читает из стандартного входа и записей к стандартному выводу и файлам. -a обозначает, добавляют.

if [ $? -ne 0 ] проверки, если предыдущая команда была успешна.

report.log хранилища предыдущее и последнее название каждого файла.

<час>

Примечание

сценарий предполагает, что имя файла содержит только одного тире -

\n\nScript FAILED' exit 1 fi done echo

Создают .bsh файл в каталоге, в котором Ваши .mobi файлы хранятся и вставляют вышеупомянутый код:

Открывают Terminal с Ctrl + Высокий звук + T и перешли к каталогу, в котором хранится Ваш сценарий:

cd /path/to/directory/

Для изменения полномочий сценария:

chmod +x <filename>.bsh

Для выполнения сценария:

bash <filename>.bsh

по некоторым причинам mv сбои при получении ошибки 'Script FAILED', иначе Вы доберетесь 'Script SUCCESSFUL'.

<час>

Объяснение

tr '_' ' ' символы нижнего подчеркивания замены с пробелом

tr '%20' ' ' замена %20 с пробелом

tr '[]' '()' квадратные скобки замены с круглыми скобками

tr -s ' ' замена несколько пробелов с одним

sed 's/\.[^.]*$//' извлечения только название файла без расширения

${string#?} удаляет первый символ строки

${string%?}, удаляют последний знак строки

mv -v, это покажет в терминале, какие файлы перемещаются. -v обозначает подробный.

tee -a changelog.log значением по умолчанию tee команда читает из стандартного входа и записей к стандартному выводу и файлам. -a обозначает, добавляют.

if [ $? -ne 0 ] проверки, если предыдущая команда была успешна.

report.log хранилища предыдущее и последнее название каждого файла.

<час>

Примечание

сценарий предполагает, что имя файла содержит только одного тире -

\n\nScript SUCCESSFUL' exit 0

Создают .bsh файл в каталоге, в котором Ваши .mobi файлы хранятся и вставляют вышеупомянутый код:

Открывают Terminal с Ctrl + Высокий звук + T и перешли к каталогу, в котором хранится Ваш сценарий:

cd /path/to/directory/

Для изменения полномочий сценария:

chmod +x <filename>.bsh

Для выполнения сценария:

bash <filename>.bsh

по некоторым причинам mv сбои при получении ошибки 'Script FAILED', иначе Вы доберетесь 'Script SUCCESSFUL'.

<час>

Объяснение

tr '_' ' ' символы нижнего подчеркивания замены с пробелом

tr '%20' ' ' замена %20 с пробелом

tr '[]' '()' квадратные скобки замены с круглыми скобками

tr -s ' ' замена несколько пробелов с одним

sed 's/\.[^.]*$//' извлечения только название файла без расширения

${string#?} удаляет первый символ строки

${string%?}, удаляют последний знак строки

mv -v, это покажет в терминале, какие файлы перемещаются. -v обозначает подробный.

tee -a changelog.log значением по умолчанию tee команда читает из стандартного входа и записей к стандартному выводу и файлам. -a обозначает, добавляют.

if [ $? -ne 0 ] проверки, если предыдущая команда была успешна.

report.log хранилища предыдущее и последнее название каждого файла.

<час>

Примечание

сценарий предполагает, что имя файла содержит только одного тире -

3
ответ дан 15 May 2016 в 17:44
  • 1
    Так как моя работа была затронута из-за этого, я должен был удалить свой весь жесткий диск/раздел для установки более старого Ubuntu 16.04 LTS. Теперь все хорошо работает:-), и я сделан с Ubuntu 17.10, больше обновлений Ubuntu в будущем – Apin Pratap 26 October 2017 в 18:56

Вы могли использовать find, xargs, и prename сделать это. Считайте их man страницы.

prename применяет Perl "регулярное выражение" к именам файлов, и find и xargs используются для контакта с именами файлов, содержащими Пробелы.

Я могу предложить:

find . -type f -iname '*.mobi' -print0 | \
    xargs -0 prename -v -n 's%^(.*/)(.*)( - )(.*)\.mobi%$1$4$3$2.mobi%'

И, это работало на меня:

  $ find . -maxdepth 1 -name '*.mobi' -print0 | xargs -0 prename -n -v 's%^(.*/)(.*)( - )(.*)\.mobi%$1$4$3$2.mobi%' 
./A Study in Scarlet - Arthur Conan Doyle.mobi renamed as ./Arthur Conan Doyle - A Study in Scarlet.mobi

Вы могли использовать дополнительное выполнение prename изменить Ваши другие забавные символы. Обязательно читайте man perlre узнать о Регулярных выражениях Perl. Если Вы не использовали регулярные выражения прежде, введение быстрого запуска доступно в man perlrequick, и более длительное учебное введение доступно в man perlretut.

0
ответ дан 15 May 2016 в 17:44
  • 1
    Вместо IFS= read, с помощью IFS=, read -r line extra мог бы получить Вас часть перед запятой бесплатно. – muru 24 October 2017 в 16:01

Другие вопросы по тегам:

Похожие вопросы: