如何递归重命名 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,其中详细讨论了这个主题,并提供了示例。
关于您的解决方案:
请注意,按照惯例,环境变量(PATH
、EDITOR
、SHELL
、...)和内部 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
命令是有目的的,这样您就不会意外损坏您的文件。当您确定它会执行预期的操作时,请将其删除。
我有一些我的设计师创建的资产,他正确地对它们进行了分支,使所有 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,其中详细讨论了这个主题,并提供了示例。
关于您的解决方案:
请注意,按照惯例,环境变量(
PATH
、EDITOR
、SHELL
、...)和内部 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
命令是有目的的,这样您就不会意外损坏您的文件。当您确定它会执行预期的操作时,请将其删除。