用于修复文件名的 Bash 脚本

用于修复文件名的 Bash 脚本

我有数百个文件夹,其中有数千个子目录和文件。文件名当前的格式为

sf{number}-{number} - {text}

我需要删除 {text} 之前的所有内容。

例子:

sf012-05 - toto - africa.cdg 
sf012-05 - toto - africa.mp3

->

toto - africa.cdg
toto - africa.mp3

其他格式:

SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The  Make It Easy On Yourself.cdg
SFLY 051 - 07 America  A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg

尤其是最后一张简直就是垃圾。

这意味着我需要一个递归正则表达式 bash 脚本或类似的东西来浏览这些文件并重命名它们。

答案1

如果您有基于 Perl 的rename实用程序(prename在某些发行版上调用),您可以使用正则表达式一次性重命名所有文件。

您的要求要求删除,sf{number}-{number}但所有示例均以大写字母开头,其中一些仅包含一个{number}, {number}-{number}-{number}, 甚至{number}{space}-{space}{number}。我假设您想要包括前两种情况。

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

-n当您准备好应用其更改时,请删除,或将其更改为-v以查看其处理文件的过程。

答案2

这里最简单的工具是桀骜(就像 bash,只是更好),及其奇特的通配符zmv功能。从要重命名文件的顶级目录运行此命令。

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

说明:**/是任何前导目录字符串。然后是一种模式sf(不区分大小写),后跟一个或多个数字、破折号和另一个数字,然后是破折号和空格。最后可以有任何后缀*。替换中的数字指的是模式中括号内的组。


或者,您可以使用prename(基于 Perl 的重命名脚本,在 Debian 和 Arch Linux 上可用,在其他发行版上可能需要单独安装)。您需要将其与find收集要重命名的文件列表结合起来。如果传递不匹配的文件并不重要rename,它会跳过不需要重命名的文件。

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +

答案3

这是代码(将目录替换为主目录,或者您拥有子目录的位置):

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

其中目录是主目录,所有子目录都在......

请不要删除“mv”中的“echo”,先测试一下。

小心不要在错误的目录中运行它,这可能非常危险。

答案4

你说你需要删除所有内容,直到{text},但你的例子并没有表明这一点。我不展示确切的代码,而只是提出一个计划。

1)编写一个脚本来完成你想要的事情文件名。像这样的事情可能会做:

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

这会破坏模式“-”上的名称并打印最后一个字段。并保存原始文件名,以便在出现问题时可以检索它。测试几次,然后用它mv来恢复名称。

2) 调用你的脚本寻找:

$ find dirname -exec script.awk {} +

这将使您的机器被许多脚本的并行调用所淹没。完成后,您将有一堆可以删除的目录,并且您将知道如何使用 find 来删除它们。

相关内容