如何递归重命名 android 资产并将破折号替换为下划线

How to rename android assets recursively and replace dash for underscore

我有一些我的设计师创建的资产,他正确地对它们进行了分支,使所有 dpi 都与它们的目录相匹配,所以我很高兴,因为我不必将这些文件复制到每个子文件夹,但是当我查看它们的名称时,它们文件名中有破折号,这使得 android 编译器失败。

那么我如何制作一个 bash 脚本来重命名 drawable-* 下的所有文件,使用相同的文件名但用下划线替换破折号?

示例:

转换为:

drawable-hdpi/
    my-icon.png
    my-icon-2.png
drawable-xhdpi/
    my-icon.png
    my-icon-2.png
drawable-xxhdpi/
    my-icon.png
    my-icon-2.png

为此:

drawable-hdpi/
    my_icon.png
    my_icon_2.png
drawable-xhdpi/
    my_icon.png
    my_icon_2.png
drawable-xxhdpi/
    my_icon.png
    my_icon_2.png

经过一些研究并阅读了几个手册页后,我创建了一个简单的脚本来实现我想要的,这是要点 normalize_assets_script

也会贴在这里:

for f in drawable-*/*; do 
    MYDIR=$(dirname $f) # Obtaining dirname
    MYFILE=$(basename $f) # Obtaining filename
    SUB=`echo $MYFILE | sed 's/-/_/g' | tr [:upper:] [:lower:]` # Replacing "-" in filename for "_" plus making lowercase
    echo "Moving File $MYDIR/$MYFILE -> $MYDIR/$SUB" #printing info to double check
    mv $MYDIR/$MYFILE $MYDIR/$SUB #moving old file to new file (need sudo)
done

不是真正的 bash 解决方案,但您可以使用 Larry Wall 的 rename 实用程序:

rename -n 's#(?>\G(?!^)|.*/)[^-]*\K-#_#g' ./pathto/drawable-*/*

-n是进行测试,当你确定了就去掉。

查看 Bash FAQ 30,其中详细讨论了这个主题,并提供了示例。

关于您的解决方案:

  • 请注意,按照惯例,环境变量(PATHEDITORSHELL、...)和内部 shell 变量( BASH_VERSION, RANDOM, ...) 全部大写。所有其他变量名都应该是小写的。自从 变量名称区分大小写,此约定可避免意外覆盖环境和内部变量。

  • "Double quote" 每个包含 spaces/metacharacters 的文字和每个扩展:"$var""$(command "$var")""${array[@]}""a & b".看 Quotes, Arguments and http://wiki.bash-hackers.org/syntax/words.

TL;DR

find /paths/to/drawable/dirs -type f -name '*-*' -print0 \
| while read -rd '' f; do
    # File's path.
    p="${f%/*}"
    # File's base-name.
    f1="${f##*/}"
    # Lower-cased base-name.
    f1="${f1,,}"
    # Rename.
    echo mv "$f" "$p/${f1//-/_}"
  done

注意:echo 命令是有目的的,这样您就不会意外损坏您的文件。当您确定它会执行预期的操作时,请将其删除。