2016-03-07 3 views
2

У меня есть некоторые активы, которые мой дизайнер создал, он правильно их разветвил, чтобы все совпадения совпадали с их каталогами, поэтому я был счастлив, потому что мне не пришлось копировать эти файлы в каждый , но когда я проверил их имена, у них были тире в именах файлов, из-за которых компилятор андроида провалился.Как переименовать андроидные активы рекурсивно и заменить тире для подчеркивания

Так как я могу сделать скрипт bash для переименования всех файлов ниже drawable- *, к тому же имени файла, но вместо тире с символами подчеркивания?

Пример:

Convert это:

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, который подробно обсуждает эту тему вместе с представленными примерами.

Что касается вашего решения:

  • Пожалуйста, обратите внимание, что в соответствии с соглашением, переменные окружения (PATH, EDITOR, SHELL, ...) и внутренних переменных оболочки (BASH_VERSION, RANDOM ...) полностью капитализированы , Все остальные имена переменных должны быть строчными. Начиная с имена переменных чувствительны к регистру, это соглашение позволяет избежать случайных переопределений экологических и внутренних переменных.

  • "Двойная кавычка" каждый литерал, который содержит пробелы/метасимволы и каждое расширение: "$var", "$(command "$var")", "${array[@]}", "a & b". См. Quotes, Arguments и 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 там нарочно, так что вы не случайно повредить ваши файлы. Удалите его, когда вы уверены, что он будет делать то, что он должен.

+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

Не совсем Баш решение, но вы можете использовать утилиту rename от Ларри Уолл:

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

-n должен выполнить тест, когда вы уверены, что удалить его.