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

Eef*_*ret 3 bash android file-rename drawable android-drawable

我有一些我的设计师创建的资产,他正确地对它们进行了分支,使所有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
Run Code Online (Sandbox Code Playgroud)

对此:

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
Run Code Online (Sandbox Code Playgroud)

Ran*_*ein 5

查看Bash FAQ 30,其中详细讨论了该主题以及所提供的示例。

关于您的解决方案:

  • 请注意,按照惯例,环境变量(PATHEDITORSHELL,...)和内部shell变量(BASH_VERSIONRANDOM,...)完全资本化。所有其他变量名应小写。由于变量名称区分大小写,因此该约定避免了意外覆盖环境变量和内部变量。

  • “双引号”包含空格/元字符,每个扩展每个文字:"$var""$(command "$var")""${array[@]}""a & b"。请参阅 引号参数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
Run Code Online (Sandbox Code Playgroud)

注意:该echo命令是故意存在的,因此您不会意外损坏文件。当您确定它会执行预期的操作时,请将其删除。