Я хочу переименовать несколько сотен файлов, имена которых отформатированы следующим образом:
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
Бонусом будет удалите все неправильные символы из имени, например:
_
[подчеркивание], чтобы заменить пустым %20
, чтобы заменить пустым []
заменить на округлые ()
Я записал маленький сценарий удара, чтобы сделать задание.
#!/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
хранилища предыдущее и последнее название каждого файла.
Примечание
сценарий предполагает, что имя файла содержит только одного тире -
Вы могли использовать 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
.
IFS= read
, с помощью IFS=, read -r line extra
мог бы получить Вас часть перед запятой бесплатно.
– muru
24 October 2017 в 16:01