我有一个文件夹,里面有很多(~60,000)个文件。他们中的大多数都有扩展名“.html.tmp”,我需要删除所有这些中的“.tmp”部分。我找到了一些类似的解决方案,但没有一个完全喜欢这个。我也只有 UNIX shell 的基本知识。OSX 不提供“重命名”命令。我想 shell 解决方案将是最方便的,但也欢迎任何其他解决方案。
提前致谢。梅里亚姆
使用循环遍历 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
最简单的解决方案如下所示:
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 的解决方案进行递归处理。但是当你根本不需要递归时,我最初的答案是最简单的。
这应该做你想要的:
find /path/to/your/files -name '*.html.tmp' -exec sh -c 'mv -i "{}" "$(dirname "{}")/$(basename "{}" .tmp)"' \;
它看起来有点复杂,因为如果文件名包含空格或其他 shell 元字符,简单的解决方案就会中断。我用过mv -i
,所以它应该在覆盖任何文件之前询问你。我建议您在对数据尝试此操作之前进行备份。