2016-03-07 58 views
2

我有一些资产是我的设计师创建的,他正确地分支它们使得所有dpi匹配它们的目录,所以我很高兴,因为我不必将这些文件复制到每个子文件夹,但当我检查出他们的名字,他们在文件名中破折号,这使得android编译器失败。如何递归重命名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 

回答

4

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

关于您的解决方案:

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

  • “双引号” 每一个文字包含空格/元字符,每个扩展:"$var""$(command "$var")""${array[@]}""a & b"。参见 Quotes,Argumentshttp://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命令是有目的的,这样你就不会意外损坏文件。当你确定它要做它应该做的事情时将其删除。

+0

您的解决方案更加优雅thnx – Eefret

+0

不客气! –

0

研究了一下,读几人张后,我创建了实现一个简单的脚本是什么我想,这里是要点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 
2

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

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

-n是进行测试,当你确信将其删除。

相关问题