如何在 Linux 上将所有文件夹和文件重命名为小写?

新手上路,请多包涵

我必须递归地重命名一个完整的文件夹树,这样任何地方都不会出现大写字母(它是 C++ 源代码,但这不重要)。

忽略 CVS 和 Subversion 版本控制文件/文件夹的奖励积分。首选方式是 shell 脚本,因为任何 Linux 机器上都应该有 shell。

关于文件重命名的细节有一些有效的论据。

  1. 我认为应该覆盖具有相同小写名称的文件;这是用户的问题。当在忽略大小写的文件系统上签出时,它也会用后者覆盖第一个。

  2. 我会考虑 AZ 字符并将它们转换为 az,其他一切都只是在要求问题(至少在源代码中)。

  3. 在 Linux 系统上运行构建需要该脚本,所以我认为应该省略对 CVS 或 Subversion 版本控制文件的更改。毕竟,这只是一个临时结账。也许“出口”更合适。

原文由 vividos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

使用 "rename" 命令的简洁版本:

 find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

这避免了目录在文件之前被重命名并试图将文件移动到不存在的目录(例如 "A/A""a/a" )的问题。

或者,不使用 "rename" 的更详细的版本。

 for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

附言

后者允许使用移动命令更灵活(例如, "svn mv" )。

原文由 Alex B 发布,翻译遵循 CC BY-SA 4.0 许可协议

更小我很喜欢:

 rename 'y/A-Z/a-z/' *

在 OS X 的 HFS+ 等不区分大小写的文件系统上,您需要添加 -f 标志:

 rename -f 'y/A-Z/a-z/' *

原文由 tristanbailey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题