一尘不染

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

linux

我必须递归重命名完整的文件夹树,以便任何地方都没有大写字母(这是C ++源代码,但这无关紧要)。

忽略CVS和Subversion版本控制文件/文件夹的加分点。首选方法是shell脚本,因为shell应该在任何Linux机器上都可用。

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

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

  2. 我会考虑AZ字符并将其转换为az,其他所有内容都只是在引起问题(至少在源代码中)。

  3. 在Linux系统上运行构建将需要该脚本,因此我认为应省略对CVS或Subversion版本控制文件的更改。毕竟,这只是从头开始。也许“出口”更合适。


阅读 358

收藏
2020-06-02

共1个答案

一尘不染

使用以下"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

ps

后者使move命令(例如"svn mv")具有更大的灵活性。

2020-06-02