【问题标题】:Batch Removing File Extensions OSX批量删除文件扩展名 OSX
【发布时间】:2013-01-04 22:41:28
【问题描述】:

我有一个文件夹,里面有很多(约 60,000 个)文件。 他们中的大多数都有扩展名“.html.tmp”,我需要删除所有这些中的“.tmp”部分。 我找到了一些类似的解决方案,但没有一个完全喜欢这个。我也只有 UNIX shell 的基本知识。 OSX 不提供“重命名”命令。 我想 shell 解决方案是最方便的,但也欢迎任何其他解决方案。

提前致谢。 梅里亚姆

【问题讨论】:

  • 如果您对终端不满意,您可以在不使用终端的情况下执行此操作。查看在 Mac 的实用程序文件夹中使用 Automator 应用程序。
  • 还有“更好的 Finder 重命名”macupdate.com/app/mac/6322/a-better-finder-rename,但你得花点钱。我不确定 Automator 是否可以让你做到这一点。我最近不得不这样做,最后使用了一个 shell 脚本。
  • 谢谢。我以前试过这个,但它使 Automator 崩溃。但现在我发现改变工作流程使其不需要提前导入所有路径而是遍历文件夹的内容似乎工作得很好。

标签: macos file shell unix


【解决方案1】:

这应该做你想做的:

find /path/to/your/files -name '*.html.tmp' -exec sh -c 'mv -i "{}" "$(dirname "{}")/$(basename "{}" .tmp)"' \;

它看起来有点复杂,因为如果文件名包含空格或其他 shell 元字符,简单的解决方案就会中断。我用过mv -i,所以它应该在覆盖任何文件之前询问你。我建议您在对数据尝试此操作之前进行备份。

【讨论】:

  • “最简单的解决方案”实际上不会破坏带有空格或其他字符的文件名。有关示例,请参见我的答案。如果您遇到破损,您可能忘记引用变量。
  • 您执行的表达式也非常复杂。 Bash 提供了 ${var%suffix} 语法来去除后缀,而不必做你正在做的奇怪的 "$(dirname "{}")/$(basename "{}" .tmp)" 事情。
  • % 语法确实如此,但您仍然必须先生成一个 shell 将文件名分配给变量,然后在扩展时剪切后缀。我喜欢@chepner 使用while read 而不是-exec 的解决方案来避免许多fork()s 并且仍然保留功能。
  • 您已经在示例中生成了一个 shell。没必要像你做的那么复杂。
【解决方案2】:

使用循环遍历 Daniel 对 find 的调用的输出;它应该更快,因为您将减少需要创建的单独进程的数量:

# Instead of calling sh, dirname, and basename for every file, use
# builtin bash commands to process the file name.
find /path/to/your/files -name '*.html.tmp' | while read fname; do
    mv "$fname" "${fname%.tmp}"
done

【讨论】:

    【解决方案3】:

    最简单的解决方案如下所示:

    for f in *.html.tmp; do mv "$f" "${f%.tmp}"; done
    

    这确实可以正确处理空格,并且不需要为每个要重命名的文件调用单独的 shell(正如丹尼尔的回答所做的那样),所以它应该更快。


    您的问题表明您的文件夹中有大约 60k 个文件,这表明没有需要处理的嵌套子文件夹。但是,如果您发现自己处于相同的位置但需要递归处理子文件夹,请继续阅读。

    如果您使用的是 Bash 4.x 并且愿意打开 shell 选项,那么您可以使用以下内容:

    shopt -s globstar
    for f in **/*.html.tmp; do mv "$f" "${f%.tmp}"; done
    

    带有globstar 选项集的构造**/*.html.tmp 意味着不仅在当前目录中,而且在任何子目录中递归匹配*.html.tmp

    如果您的 Bash 版本早于 4.x,那么我建议使用 chepner 的递归处理解决方案。但是当你根本不需要递归时,我最初的答案是最简单的。

    【讨论】:

    • 这不会递归处理子目录。
    • @DanielRoethlisberger,问题没有提到放入子目录。此外,这是处理非常奇怪的文件名的最安全方法(例如,这可以处理包含换行符的文件名)。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2020-11-16
    • 2011-09-18
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多