我想要重命名几百个文件,其名称格式如下:
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
用空白代替[]
用圆形的代替()
答案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
、、xargs
和prename
来执行此操作。阅读他们的man
页面。
prename
将 Perl “正则表达式”应用于文件名,并且find
和xargs
用于处理包含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
。