如何递归地将文件名更改为小写并更新对它们的所有引用?

时间:2015-01-09 20:30:24

标签: bash

我需要将MathJax库中的所有文件重命名为小写,并更新对它们的所有引用,以符合某些SVN限制。有没有人有一个bash脚本,将为我这样做?感谢。

2 个答案:

答案 0 :(得分:1)

要将文件从大写重命名为小写,可以使用rename命令。在这种情况下,您可以输入包含库文件的目录并运行以下命令将所有文件重命名为小写:


find . -exec readlink -e '{}' \; | xargs rename  'y/A-Z/a-z/'

尝试完毕后告诉我你的反馈意见。

答案 1 :(得分:0)

这是我提出的解决方案。该脚本基于另一个Stack Overflow答案:How to create a bash script that will lower case all files in the current folder, then search/replace in all files?。我只是改变它来浏览整个目录树。让我困扰一段时间的一件事是需要在-d开关之后为sed提供空字符串以使其与Mac OS X一起使用:

#!/bin/bash
find . -type f -name '*.js' -print0 | while IFS= read -r -d '' file; do
#Check to see if the filename contains any uppercase characters
    oldfilename=$(basename $file)
    iscap=`echo $oldfilename | awk '{if ($0 ~ /[[:upper:]]/) print }'`
    if [[ -n $iscap ]]
    then
#If the filename contains upper case characters convert them to lower case
        newname=`echo $oldfilename | tr '[A-Z]' '[a-z]'` #make lower case
#Perform various search/replaces on the file name to clean things up
        newname=$(echo "$newname" | sed 's/---/-/')
        newname=$(echo "$newname" | sed 's/--/-/')
        newname=$(echo "$newname" | sed 's/-\./\./')
        newname=$(echo "$newname" | sed 's/there-s-/theres-/')
#Rename file
        newpathandfile=$(dirname $file)/$newname
        echo "Moving $file\n To $newpathandfile\n\n"
        mv $file $newpathandfile
#Update all references to the new filename in all php files
        find . -type f -name '*.js' -print0 | while IFS= read -r -d '' thisfile; do
            sed -i '' -e "s/$oldfilename/$newname/g" $thisfile
            echo "$thisfile s/$oldfilename/$newname/g"
        done
    fi
done

我部分通过脚本重命名目录,部分手动重命名。还有其他类型的文件(特别是Web字体),我可以使用此脚本重命名,但指定了相应的文件扩展名。

MathJax自定义的最后步骤涉及转换为小写config.root中的值。我找不到任何其他人必须将整个MathJax库转换为小写文件和目录名称,因此这个问题/答案的一部分可能对其他人没有多大价值。

我提出的脚本需要一段时间才能运行,但这对我来说不是问题;我不认为我将不得不再次运行它!