shell下用 %% ## 自定义规则提取字符



Android手机上每个已安装的程序都有对应的安装包即apk文件存在,放在/data/app/下,这也是那些软件备份软件的原理。但是必须要root后才能访问到。

我现在要备份应用,就是要复制这些apk文件到其他地方,比如sdcard。用adb shell登录到手机

adb shell
su
cd /data/app/
ls */base.apk

得到

cmb.pb-1/base.apk
cn.wq.myandroidtoolspro-1/base.apk
com.Fraom.KiwiUI-1/base.apk
com.baidu.BaiduMap-1/base.apk

省略若干。

这些apk文件名都一样,都是base.apk,且层级相同,就只有所在父文件夹不同。

其实在linux shell里复制是可以保留目录结构的,加上--parent选项就可以连带父文件夹一起复制走。很不幸在Android shell下不认识这个选项。

于是就得写一个shell脚本来拷贝。但是拷贝到desc后文件名不能重复啊,要改名才行,随便改成啥,不如改成跟父文件夹最后一个字符串一样的名字好了。

比如 com.sina.weibo-1/base.apk 要改成 com.sina.weibo-1 -> weibo-1.apk。

这里用到 # ## % %% 通配符。如 file = com.sina.weibo-1/base.apk, 第一步用 

tmp=${file%/*}

得到 com.sina.weibo-1

这里 %/* 的意思是,从右边起,到第一个 / 之间字符都去掉。

tmp=${tmp##*.}

得到 weibo-1

这里 ##*. 的意思是去掉从左边开始到最后一个 . 之间的字符串。然后就能用循环处理剩下的。

此外,

#:表示去掉从左边开始到第一个任意字符之间的字符串
%%:表示去掉从右边开始到最后一个任意字符之间的字符串


附上脚本源码

filelist=`ls */base.apk`
for file in $filelist
do
	tmp=${file%/*}
	#echo ${file}
	tmp=${tmp##*.}
	#echo ${file}
	cp -a ${file} /sdcard/backup/apps/${tmp}.apk
	echo ${tmp}
done


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值