批量重命名特殊格式的文件

批量重命名特殊格式的文件

我想要重命名几百个文件,其名称格式如下:

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

我编写了一个小型 Bash 脚本来完成这项工作。

#!/bin/bash

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

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

echo $'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 $'\n\nScript FAILED'
        exit 1
    fi
done

echo $'\n\nScript SUCCESSFUL'
exit 0

在存储 .mobi 文件的目录中创建一个 .bsh 文件并粘贴上述代码:

使用Ctrl++打开终端并导航到存储脚本的目录:AltT

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存储每个文件的前一个和最新的名称。


笔记

该脚本假定文件名仅包含一个破折号-

答案2

您可以使用find、、xargsprename来执行此操作。阅读他们的man页面。

prename将 Perl “正则表达式”应用于文件名,并且findxargs用于处理包含Space字符的文件名。

我可以提供:

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

相关内容