对linux不编程实现文件重命名的研究

对不编程实现文件重命名的研究
这是一个经过3911次失败终于成功完成目标的总结,起初想用find -exec 发现基本不可行,又想做安卓程序,后来想到用ls>ff.txt处理成sh,最后是用正则表达式,绕过unicode方言问题,做出了最简实现
我这个想法主要来源于 把手机文件转移到电脑的时候 如果包含某些符号 就会导致剪切转移失败 非常恶心 而且这些文件又是在手机上 想对他们批量重命名 显然不像在电脑上操作那样方便 制作一个安卓软件 又有点小题大做 
所以就需要用 shell
开始能不能实现 我是不确定的 所以我想到的替代方案就是 ls 获取文件列表 然后输出到一个文本 把这个文本放在电脑上 通过正则表达式处理成 若干个文件 移动的命令 然后再放到手机上去执行 这个想法是可以实现的 
正好发现自己的这个shell sed awk技术水平不高 所以就看一下这些技术 结合着网上别人的经验 经过一番研究发现 实际是可以完全通过这些命令来实现我这个想法 
手机上的文件要往电脑上转移 首先需要注意的就是 emoji 然后就是空格和竖线 这个就要用正则表达式来匹配 , 但是正则表达是存在着诸多方言 ,对于这些unicode超集字符\U10000-\U10ffff支持的 一般都不完善 ,以我最常用的 notepad++来说,他的正则表达式需要计算 utf8码然后写成 [\x{d800}\x{dc00}-\x{d87f}\x{dfff}],这样就变成了两个字符 已经不支持范围匹配 ,我没有找到范围匹配的方法 ,很可能无法支持 
这时候,我简单地尝试这个:
正则表达式替换表情符
echo 1+2=🦄 吧 | awk 'gsub(/\W+/,"_")'
 echo 1+2=🦄 吧 |sed -E 's/\W+/_/g'
echo 1+2=🦄 吧 |grep -E '\W+' -o 
 echo 1+2=🦄 吧 | awk 'gsub(/[^\x00-\uffff]+/ug,"_")'
 echo 1+2=🦄 吧 |sed -E 's/[^\x00-\uffff]+/_/ug'
echo 1+2=🦄 吧 |grep -E '[^\x00-\uffff]+' -o 
很不理想
这时候 我看了大量的文档 其中就看到了grep 官方文档 ,这个文档就让我想到 ,汉语版的这些技术文档就像是九阴真经的前半部 ,翻译的一般都是不完整的 ,很多时候需要看洋文本  ,仔细看这个官方文档 之前我大概可以匹配到这些特殊符号 用的方法就是 \W 初步筛选 然后进一步筛选 ,但是看了官方文档 我才发现 实际上有更好的办法 那就是在正则表达式这个 整个的引号前面加上美元符号 ,让系统把这个 编码加上转义符号变成目标符号 ,那就是大概写成这样 $'[^\x00-\uffff]'由于这个零表示结尾 所以我把它改成一 ,由于windows系统上边其他几个符号也不能使用 所以在这里一并的加上 这时候 正则表达式变成 $'([^\x01-\uffff]|[ ><\\|":?])'
这样写是可以理解的 理论上说 我可以使用转义前的编码 这样更好  把这个单斜线变成双斜线 但是如果是我期望 把里边的单斜线变成双斜线 ,就是使用转移的方法 ,那这个grep就不能正确的识别 这是他的不完善导致的 
然后经过验证 ,这个正则表达式 也可以在awk 或者是 sed上面使用 而且他们的问题一样 ,都是不支持这种转义前的 这种双斜线写法 
当然 更理想的写法不是用反义,而是直接取这个范围 ,但是这些软件都不支持 \U10000-\U10ffff,但是他们能支持反义的写法 已经谢天谢地了 
然后经过阅读这个awk 还有 sed官方文档 ,就可以写出想要的这个命令了,这两种都可以,根据个人偏好取用 ,我更喜欢 sed,但是在这里用awk似乎更加容易胜任 (牢记awk千万不要加/g)
用awk
ls|awk -e $'$0 ~ /([^\x01-\uffff]|[ ><\\|":?])+/ {printf "%s \'%s\'  \'%s\'\\n" , "mv",$0,gsub(/([^\x01-\uffff]|[ ><\\|":?])+/,"_")?$0:$0}'|sh
用sed(待完善 用for默认有空格问题 要配置环境解决 或者先rename ' ' _ * -v)
ff=`ls|sed -n -E $'/([^\x01-\uffff]|[ ><\\|":?])+/p'`
for f in $ff;do echo -e mv \'$f\'  `echo $f|sed -E $'s/([^\x01-\uffff]|[ ><\\|":?])+/_/g' ` |sh;done 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值