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