我有数百个文件夹,其中有数千个子目录和文件。文件名当前的格式为
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 来删除它们。