3

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

提前致谢。梅里亚姆

4

3 回答 3

3

使用循环遍历 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
于 2013-01-22T00:32:02.103 回答
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

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

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

于 2013-01-22T00:35:57.700 回答
1

这应该做你想要的:

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

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

于 2013-01-21T21:07:44.027 回答