删除文件夹/文件名前的所有空格

4

我已经编写了一个命令,可以删除目录(包括子目录)中所有文件夹/文件名称前面的所有空格。

find /dir/* -depth -execdir rename 's/^\s+//g' * "{}" \; 

它在一些小目录中(带有一些子目录)工作正常,但对于大目录来说需要花费很长时间。我发现该命令被执行的次数比必要的多,但我不知道为什么。

有人能建议如何加速吗?

/编辑:我使用的操作系统是Debian 8.2。


3
您可能需要调整您的"find"命令,以返回只以空格开头的文件名。除非我有所遗漏,否则您当前正在重命名所有文件。 - Richard St-Cyr
使用 + 替换 \;,以便一次性执行 rename 命令(是否基于 Perl 的 rename),而不是每个文件都执行一次。此外,正如 Richard St-Cyr 指出的那样,请勿尝试重命名不需要重命名的文件或目录。 - Jonathan Leffler
@RichardSt-Cyr 谢谢你的建议。我以为我的查找命令只会遍历/dir中的每个目录,然后访问所有子目录,然后在其中执行我的重命名命令。我是否误解了find的工作方式?oOJonathanLeffler 是的,这是pearl重命名命令。 嗯,那么我需要更多地研究find的工作原理。我认为它会打开一个文件夹,执行命令,然后打开下一个文件夹...令人困惑^^感谢你们两位的帮助 :) - Dice
1个回答

1
我认为你误解了find命令的-execdir参数的工作原理。rename命令将从包含匹配文件的子目录运行,但它仍将为每个匹配的文件调用。你的rename参数包括*通配符,因此在每个有N个文件的子目录中,你将对N^2个文件调用rename。(+1是由find填充的"{}"。)
问题是,我认为你的rename正则表达式之所以有效,是因为有*。我不认为它实际上会匹配"{}"部分。
因此,总结一下(包括以上的评论):
  1. 使用-regex来查找只想要重命名的文件。
  2. 使用+而不是;来分组文件。
  3. 去掉通配符*
  4. 修复rename正则表达式以操作匹配文件的基本名称(find将传递具有./前缀的路径)。

另一种方法可能是找到所有子目录中有以空格开头的文件/文件夹,然后仅在这些目录中运行rename *。直觉告诉我们第一种方法更有效,但这可能取决于匹配文件的数量和分布。

(抱歉,我没有时间为您编写一行代码!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接