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

Posted

技术标签:

【中文标题】删除文件夹/文件名的所有前导空格【英文标题】:Delete all leading whitespace of folder/file names 【发布时间】:2016-03-29 08:26:01 【问题描述】:

我已经构建了一个命令来删除一个目录(带有子目录)中所有文件夹/文件名的所有前导空格。

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

它适用于一些小目录(带有一些子目录),但对于大目录则需要 非常 长时间。我看到命令执行的次数超出了必要的次数,但我不知道为什么。

有人可以建议如何加快速度吗?

/edit:我正在使用 Debian 8.2 作为操作系统。

【问题讨论】:

您可能需要调整 find 命令以仅返回以空格开头的名称。除非我遗漏了什么,否则您当前正在重命名所有文件。 使用+ 代替\; 以便它执行rename 命令(即基于Perl 的rename)对一组文件执行一次,而不是每个文件执行一次文件。 (另外,正如 Richard St-Cyr 指出的那样,不要尝试重命名不需要重命名的文件或目录。) @RichardSt-Cyr 感谢您的建议。我以为我的 find 命令只会到达 /dir 中的每个目录,然后访问所有子目录,然后在其中执行我的重命名命令。我是否误解了 find 的工作原理? oO JonathanLeffler 是的,它的珍珠重命名命令。嗯,好的,那么我需要对 find 的工作原理进行更多研究。我虽然它会打开一个文件夹,执行命令然后打开下一个文件夹......令人困惑^^感谢你们的帮助:) 【参考方案1】:

我认为您误解了find-execdir 参数的工作原理。 rename 命令将从包含匹配文件的子目录运行,但仍会为 每个 匹配文件调用。您的rename 参数包括* 通配符,因此在每个包含N 个文件的子目录中,您将对N^2 个文件调用rename。 (为"" 填写的find 提供+1。)

问题是,我认为您的 rename 正则表达式仅因为 * 而有效。我认为它实际上不会匹配 "" 部分。

总结一下(包括上面的 cmets):

    使用-regex 仅查找要重命名的文件。 使用+ 而不是; 对文件进行分组。 删除通配符*。 修复 rename 正则表达式以对匹配文件的基本名称进行操作(find 将传递带有 ./ 前缀的路径)。

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

(对不起,我没有时间真正为你写一行!)

【讨论】:

以上是关于删除文件夹/文件名的所有前导空格的主要内容,如果未能解决你的问题,请参考以下文章

从字符串值中删除空格(前导和尾随)

XSLT 删除所有属性的前导和尾随空格

如何取回使用 .trim 删除的所有原始前导和尾随空格? [复制]

如何删除 Python 中的前导空格?

用C语言编辑,输入一个英文句子,删除句子的前导空格和后导空格,并使单词之间只有一个空格。

前导和尾随空格剪切 + 中间空格替换