我可以在文件中使用Bash在UpperCamelCase,lowerCamelCase和dash-case之间进行转换吗?

时间:2013-10-07 18:53:52

标签: bash camelcasing

我正在与另一位开发人员合作。我正在使用UpperCamelCasing,但我们决定关注Google's HTML style guide in using lower case and separating words with hyphens。这个决定要求我在我的文件系统上重命名一些文件。我首先虽然这很容易,因为我经常使用bash重命名大型文件集合。不幸的是,在Casing风格上重命名似乎有点复杂,我没有找到方法。

我可以使用Bash将文件从一种命名约定转换为另一种命名约定吗?

3 个答案:

答案 0 :(得分:2)

尝试使用带有rename选项的-f命令重命名具有所需替换的文件。

rename -f 's/([a-z])([A-Z])/$1-$2/g; y/A-Z/a-z/' <list_of_files>

如果您还要使用某种模式提取<list_of_files>,我们要说扩展名为.ext,您需要使用find

xargs与上述命令合并
find -type f -name "*.ext" -print0 | xargs -0 rename -f 's/([a-z])([A-Z])/$1-$2/g; y/A-Z/a-z/'

例如,如果要重命名pwd

中的所有文件
$ ls
dash-case
lowerCamelCase
UpperCamelCase

$ rename -f 's/([a-z])([A-Z])/$1-$2/g; y/A-Z/a-z/' *

$ ls
dash-case
lower-camel-case
upper-camel-case

答案 1 :(得分:2)

试试这个:

for FILE in *; do NEWFILE=$((sed -re 's/\B([A-Z])/-\1/g' | tr [:upper:] [:lower:]) <<< "$FILE"); if [ "$NEWFILE" != "$FILE" ]; then echo mv \""$FILE"\" \""$NEWFILE"\"; fi; done

这应该为您提供标准输出的“mv”语句列表。仔细检查它们是否正确,然后只需将| bash添加到语句的末尾即可全部运行它们。

它是如何运作的?

for FILE in *; do
  NEWFILE=$((sed -re 's/\B([A-Z])/-\1/g' | tr [:upper:] [:lower:]) <<< "$FILE")
  if [ "$NEWFILE" != "$FILE" ]; then
    echo mv \""$FILE"\" \""$NEWFILE"\"
  fi
done

for FILE in *遍历当前目录中的所有文件,确认有多种方法可以遍历所有文件。 sed语句只匹配大写字母,根据\B,它不在单词边界上(即在字符串的开头)。由于这种选择性匹配,在单独调用tr时将所有内容切换为小写是最有意义的。最后,条件确保您只看到更改的文件名,并且使用echo的技巧可确保您不首先看到它们就不会对文件系统进行更改。

答案 2 :(得分:-1)

我遇到了一个similar question,基于一个答案,我找到了以下解决方案。它不是一个完整的Bash解决方案,因为它依赖于perl,但是因为它实现了我分享它的技巧。

ls  |for file in `xargs`; do mv $file `echo $file | perl -ne 'print lc(join("-", split(/(?=[A-Z])/)))'`; done