我有几个文件夹,其中包含一些我想重命名的文件
Foo'Bar - Title
自
Title
我使用的是OS X 10.7。我看过其他解决方案,但没有一个能很好地解决递归问题。
有什么建议吗?
您的问题有两个部分:查找要递归操作的文件,并重命名它们。
对于第一个,如果所有内容都正好比当前目录低一级,您可以只列出当前目录中每个目录的内容(如上面的 Mattias Wadman 的回答(,但更一般(可能更容易理解,引导(,你可以使用 find 命令。
对于第二个,您可以使用 sed 并弄清楚如何正确引用和管道(您最终肯定会学习(,但使用 rename 命令要简单得多。不幸的是,这个不是内置在Mac上的,但是您可以使用Homebrew之类的方法安装它,或者只是下载perl脚本并sudo install -m755 rename /usr/local/bin/rename
。
因此,您可以这样做:
find . -exec rename 's|[^/]* - ||' {} +
如果要执行"试运行"以确保其正确,请添加"-n"标志以重命名:
find . -exec rename -n 's|[^/]* - ||' {} +
要了解它是如何工作的,你真的应该阅读查找教程和重命名手册页,但分解它:
-
find .
的意思是"递归查找当前目录下的所有文件"。 - 您可以添加其他测试来过滤内容(例如,如果您想跳过常规文件以外的所有内容,
-type f
,或者如果您只想更改以"标题"结尾的文件,则添加"-name '*Title"(,但这对于您的使用不是必需的。 -
-exec
......+
表示对找到的文件进行批处理,并尽可能多地传递这些文件,以代替"..."中显示的命令中的任何{}
。 -
rename 's|[^/]* - ||' {}
表示对于 {} 中的每个文件,将 perl 表达式s|[^/]* - ||
应用于文件名,如果结果不同,则将其重命名为该结果。 -
s|[^/]* - ||
表示匹配正则表达式 '[^/]* -
' 并将匹配替换为 ''(空字符串(。 -
[^/]* -
表示匹配任何以 ' - ' 结尾的非斜杠字符字符串。因此,在"./A/FooBar - Title
"中,它将与"FooBar -
"匹配。
我应该提到,当我有这样复杂的事情要做时,如果经过几分钟和几次尝试使用 find/sed/awk/rename/etc 来正确处理它,我仍然没有得到它,我经常只是用 Python 和 os.walk 命令性地编写它。如果你了解Python,这可能更容易理解(虽然更冗长,不那么简单(,并且更容易修改为其他用例,所以如果你有兴趣,请问一下。
试试这个:
ls -1 * | while read f ; do mv "$f" "`echo $f | sed 's/^.* - //'`" ; done
我建议您在运行mv
之前添加一个echo
,以确保命令看起来正常。正如 abarnert 在评论中指出的那样,此命令一次仅适用于一个目录。
各种命令的详细说明:
ls -1 *
将为当前目录中的每个文件(和目录(输出一行(.
-files除外(。因此,这将扩展到 ls -1 file1 file2 ...
,-1
到 ls
告诉它只列出文件名和每行一个文件。
然后将输出通过管道传输到while read f ; ... ; done
,read f
返回零时循环,直到到达文件末尾。 read f
一次从标准输入(在本例中是 ls -1 ...
的输出(读取一行,并将其存储在指定的变量中,在本例中为 f
.
在 while 循环中,我们运行一个带有两个参数的 mv
命令,第一个"$f"
作为源文件(注意引号以处理带空格等的文件名(,第二个目标文件名使用 sed 和 ' (反引号(执行所谓的命令替换,它将调用反引号内的命令并将其替换为标准输出的输出。
echo $f | sed 's/^.* - //'
将当前文件$f
管道传输到 sed,该 sed 将与正则表达式匹配并执行替换(s/
中的s
(并在标准输出上输出结果。正则表达式是^.* -
它将从字符串^
的开头匹配(称为锚定(,然后.*
任何字符后跟-
并将其替换为空字符串(//
之间的字符串(。
你要求批量重命名,但我建议你使用Automator。它运行良好,如果您将其创建为服务,您将在上下文菜单中选择该选项:)
经过一些试验和错误,我遇到了这个解决方案,它对我解决了同样的问题。
find <dir> -name *.<oldExt> -exec rename -S .<oldExt> .<newExt> {} ;
基本上,我利用查找和重命名实用程序。这里的诀窍是弄清楚重命名的"{}"(表示需要通过重命名处理的文件(的位置。
P.S. 重命名不是内置的 Linux 实用程序。我使用OS X并使用自制软件来安装重命名。