如何在 MacOS 中递归地重命名文件夹和文件
Posted
技术标签:
【中文标题】如何在 MacOS 中递归地重命名文件夹和文件【英文标题】:How to rename folders and files recursively in MacOS 【发布时间】:2014-02-07 13:52:24 【问题描述】:我曾经有一台 Debian 机器,我记得使用过类似的东西:
shopt -s globstar
rename 's/changethis/tothis/' **
但也许是因为我得到的 bash 版本(版本 3.2.48(1))不是最新的:
-bash: shopt: globstar: invalid shell option name
-bash: rename: command not found
在 OS X 中递归重命名文件和文件夹有什么不同的方法? (10.8.5)
我想将每个包含sunshine
字符串的文件夹和文件重命名为sunset
。所以文件:
post_thumbnails_sunshine
将变为 post_thumbnails_sunset
和 r_sunshine-new
将变为 r_sunset-new
等等。
【问题讨论】:
一方面,rename
似乎是第三方实用程序:plasmasturm.org/code/rename。 (在 Homebrew 上可用。)globstar
是 Bash 4.0 中的新功能:linuxjournal.com/content/globstar-new-bash-globbing-option
您希望在命令提示符下直接使用 unix 命令。比如:find . -name "from_this" -exec mv to_this \;
@mbratch 这只会替换完全匹配.. 我还想将 changethis-one
等文件重命名为 tothis-one
我没有关注。您的新替换示例不显示任何通配符,问题陈述中的示例也不显示。您能否在问题描述中进一步解释您要重命名的内容?你有一个要重命名的列表吗?还是一种模式?
@mbratch 为问题添加了模式。
【参考方案1】:
find . -depth -name "*from_stuff*" -execdir sh -c 'mv $(echo | sed "s/from_stuff/to_stuff/")' \;
【讨论】:
你应该避免使用反引号。$()
更好。
@Sebastian 感谢您发现这一点,我同意(已编辑)。【参考方案2】:
这应该可以解决问题:
find . -name '*sunshine*' | while read f; do mv "$f" "$f//sunshine/sunset"; done
*专门重命名文件使用-type f
,目录使用-type d
【讨论】:
【参考方案3】:您可以在 find
命令中使用正则表达式,如 cmets 中的 @mbratch 所述。您可以使用-regex
、-iregex
和-regextype
为find
提供完整的表达式。然后调用-exec mv +
(注意+
符号)。
【讨论】:
以上是关于如何在 MacOS 中递归地重命名文件夹和文件的主要内容,如果未能解决你的问题,请参考以下文章