我已经编写了一个命令,可以删除目录(包括子目录)中所有文件夹/文件名称前面的所有空格。
find /dir/* -depth -execdir rename 's/^\s+//g' * "{}" \;
它在一些小目录中(带有一些子目录)工作正常,但对于大目录来说需要花费很长时间。我发现该命令被执行的次数比必要的多,但我不知道为什么。
有人能建议如何加速吗?
/编辑:我使用的操作系统是Debian 8.2。
我已经编写了一个命令,可以删除目录(包括子目录)中所有文件夹/文件名称前面的所有空格。
find /dir/* -depth -execdir rename 's/^\s+//g' * "{}" \;
它在一些小目录中(带有一些子目录)工作正常,但对于大目录来说需要花费很长时间。我发现该命令被执行的次数比必要的多,但我不知道为什么。
有人能建议如何加速吗?
/编辑:我使用的操作系统是Debian 8.2。
find
命令的-execdir
参数的工作原理。rename
命令将从包含匹配文件的子目录运行,但它仍将为每个匹配的文件调用。你的rename
参数包括*
通配符,因此在每个有N个文件的子目录中,你将对N^2个文件调用rename
。(+1是由find
填充的"{}"
。)rename
正则表达式之所以有效,是因为有*
。我不认为它实际上会匹配"{}"
部分。-regex
来查找只想要重命名的文件。+
而不是;
来分组文件。*
。rename
正则表达式以操作匹配文件的基本名称(find
将传递具有./
前缀的路径)。另一种方法可能是找到所有子目录中有以空格开头的文件/文件夹,然后仅在这些目录中运行rename *
。直觉告诉我们第一种方法更有效,但这可能取决于匹配文件的数量和分布。
(抱歉,我没有时间为您编写一行代码!)
+
替换\;
,以便一次性执行rename
命令(是否基于 Perl 的rename
),而不是每个文件都执行一次。此外,正如 Richard St-Cyr 指出的那样,请勿尝试重命名不需要重命名的文件或目录。 - Jonathan Leffler