删除文件夹/文件名的所有前导空格
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 *
。直觉说第一种方法效率更高,但可能取决于匹配文件的数量和分布。
(对不起,我没有时间真正为你写一行!)
【讨论】:
以上是关于删除文件夹/文件名的所有前导空格的主要内容,如果未能解决你的问题,请参考以下文章
如何取回使用 .trim 删除的所有原始前导和尾随空格? [复制]