【问题标题】: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 的工作原理进行更多研究。我虽然它会打开一个文件夹,执行命令然后打开下一个文件夹......令人困惑^^感谢你们的帮助:)

标签: bash shell find batch-rename


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多