如何在MacOS中递归地重命名文件夹和文件

12

我曾经有一台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_sunsetr_sunshine-new将变成r_sunset-new等。


1
首先,rename 似乎是第三方实用程序:http://plasmasturm.org/code/rename/。(可在 Homebrew 上获得。)而 globstar 是 Bash 4.0 中的新功能:http://www.linuxjournal.com/content/globstar-new-bash-globbing-option - millimoose
你需要在命令提示符下使用直接的Unix命令。例如:find . -name "from_this" -exec mv {} to_this \; - lurker
@mbratch 这只会替换完全匹配的内容.. 我还想将文件名从 changethis-one 改为 tothis-one - Tom
我不太明白。你的新替换示例中没有显示任何通配符,而且在你的问题陈述中也没有示例。你能否在问题描述中进一步解释你要重命名什么?你有一个重命名列表吗?或者有一个模式吗? - lurker
@mbratch在问题中添加了模式。 - Tom
你可以根据这个链接添加globstar:http://mistermorris.com/blog/get-yourself-globstar-bash-4-for-your-mac-terminal/ - David
3个回答

17
 find . -depth -name "*from_stuff*" -execdir sh -c 'mv {} $(echo {} | sed "s/from_stuff/to_stuff/")' \;

2
你应该避免使用反引号,而是使用 $() - Sebastian
@Sebastian,感谢你发现了这个问题,我同意(已编辑)。 - lurker

3
这应该可以解决问题:
find . -name '*sunshine*' | while read f; do mv "$f" "${f//sunshine/sunset}"; done

如果要特定地重命名文件,使用-type f;如果要重命名目录,则使用-type d


0

您可以像@mbratch在评论中所述那样,在find命令中使用正则表达式。 您可以使用-regex-iregex-regextype来为find提供完整的表达式。 然后调用-exec mv {} +(注意+符号)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接