作者JackBaska (Baska)
看板Linux
标题[问题] 在bash里面呼叫外部程式还有重组字串?
时间Wed Jan 27 17:38:08 2016
=======问题已解 回馈code给大家以後用=========
感谢各位大大细心的分享跟教导,这只小script分享给
之後跟我一样有大量xlsx转csv的人,使用方法只要
sh script.sh "存取资料夹"
便会把你该资料夹所有xlsx转成csv档
但记得要装 python的xlsx2csv
参考: sudo pip install xlsx2csv
========ˇscript============
#!/bin/bash
# this script have dependence package of Python "xlsx2csv"
sudo PATH =
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~/bin
sudo export PATH
sudo echo "Start translate !"
mkdir $1
for f in `ls -1 *.xlsx`
do
xlsx2csv $f $1/${f%.*}.csv;
echo ${f%.*}
done
echo "Translation done"
~
==============================================
由於对linux 的bash一些比较特殊的写法还不是那麽熟练
想跟各位linux先进请教一个写bash时的问题
想做的事情是:
用bash的方式进行xlsx转档,这里我呼叫了一个python
工具 xlsx2csv , 这个用法在 terminal时已经确定可以
使用 , 而且转换效果很好
遇到的问题:
1. 一直出现中文档名乱码问题 , 原始档案是big5没错
2. 不确定这麽写能不能像teminal一样直接叫到python
的xlsx2csv
错误范例:
========================================================================
#!/bin/bash
PATH = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
sudo echo "Start translate !"
sudo xlsx2csv 2011某中文档名.xlsx Test_covert/2011某中文档名.csv
echo "Translation done"
=======================================================================
这只是我在做初步测试用bash 仿制我在terminal做的行为,且在terminal已经确定
会有我要的结果 , 但bash上面我一直没有确切的方向,查也都只查到bash的一般语法
会需要这麽做主要是会批量转档的需求,所以後续还要串loop还有让档名重新产生
用过一般的批量转档程式但出来的结果是资料 "看起来" 没有任何问题,但一旦经过
任何程式呼叫後 , 会有大量的资料在呼叫过程中无故遗失,而用command line呼叫手转
的资料则没有这问题
虽然可以另外写python code直接做这件事情,但目前我试过最快且最稳的是command line
这个方法,加上很想知道如果我在 bash 里面要呼叫非一般shell的程式还有做字串重组
跟commnad重新产生 (有点像eval 但我还不确定bash叫什麽) , 对小弟来说算是一个有趣
的应用,想问各位先进是否有做过这件事情 ???
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.196.140
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1453887490.A.485.html
1F:→ CP64: for f in `ls -1 *.xlsx` 01/27 18:04
2F:→ CP64: do xlsx2cxv $f Test_convert/${f%.*}.csv 01/27 18:05
3F:→ CP64: 问的是这种吗 ? 01/27 18:05
4F:→ CP64: 啊 少了 done 01/27 18:05
5F:→ CP64: 关於字串改写可以参考 bash manpage 的 Parameter Expansion 01/27 18:08
6F:→ tjjh89017: 真不愧是CP64大师<(_ _)> 01/27 18:18
7F:→ JackBaska: 感谢CP64大大,我可以叫到我要的档案了,不过shell问题我 01/27 20:55
8F:→ JackBaska: 还没搞定,会一直显示找不到 xlsx2csv的方法,我还在研究 01/27 20:56
9F:→ JackBaska: 怎麽得到一般操作的完整shell PATH 资讯 01/27 20:56
10F:→ CP64: 你下个 sudo env 看输出应该就会知道发生啥事了 01/27 21:13
11F:→ CP64: 你的 sudo 吃不到你下的 PATH 01/27 21:14
12F:→ CP64: 不过有点好奇有需要用 sudo 吗? 何不产在 /tmp 再搬过去 01/27 21:18
13F:→ JackBaska: 小弟算新手,最近越来越受不了windows的command怒切了点 01/27 21:20
14F:→ JackBaska: 空间装linux,大概用一个礼拜已经爱上了 XD 01/27 21:21
15F:→ JackBaska: 最近还在拜读鸟哥的文章,但其实很多观念还在建立 01/27 21:21
16F:→ JackBaska: 常常用sudo是因为有时候对一些指令还不熟悉,偏偏需要权 01/27 21:22
17F:→ JackBaska: 限, 不过我现在还有点茫 因为两个 PATH是一样的 01/27 21:22
18F:→ CP64: 感觉转换程式应该是不至於用到 sudo 的 01/27 21:26
19F:→ CP64: 啊 不对 我看错了一点东西 01/27 21:27
20F:→ JackBaska: path问题解掉了,现在在解令一个执行喷错 XD 01/27 21:27
21F:→ JackBaska: 另 01/27 21:27
22F:→ JackBaska: 现在执行成功了,但原本的档名encoding问题又回来了 01/27 21:28
23F:→ JackBaska: 成功呼叫到xlsx2csv,但是档名encoding问题跑出来了 01/27 21:29
24F:→ CP64: 现在是转完的档名会乱码吗? 还是档名乱码导致读不到档? 01/27 21:33
25F:→ JackBaska: 档名乱码导致xlsx2csv在读档阶段喷错,我现在在查要怎麽 01/27 21:34
26F:→ JackBaska: 在bash里面做一部分字串的转码 01/27 21:35
27F:→ CP64: 建议用 iconv 01/27 21:36
28F:→ CP64: 啊 应该是说用 convmv 01/27 21:38
29F:→ CP64: 先把档名转一转 01/27 21:38
30F:→ JackBaska: 下午我在试时 iconv 我撞到xlsx不知道要怎麽处理 QQ 01/27 21:46
31F:→ JackBaska: convmv 是还没弄懂下法 现在在试 QQ 01/27 21:47
32F:→ kenduest: 有几个问题确认一下: 01/28 00:03
33F:→ kenduest: 1. 一开始问题,你 script 的变数语法宣告有问题 01/28 00:04
34F:→ kenduest: PATH=path1:path2:path3 这样子,= 符号两边不可以空白 01/28 00:04
35F:嘘 kenduest: 2. 你改了 PATH 变数,不一定会让 sudo 执行时候套用 01/28 00:11
36F:→ kenduest: 不小心按到「嘘」的选项 -.-" 01/28 00:12
37F:→ kenduest: 3. sudo 的 PATH 很多解法,一般最简单可以改目的帐号 01/28 00:12
38F:→ kenduest: 的 shell 设定档案设定,後续使用 sudo -i 方式来执行 01/28 00:13
39F:→ kenduest: 吃目的身份的 shell 初始化环境设定配置就可以了 01/28 00:13
40F:推 kenduest: 4. 你的当下语系是 zh_tw.Big5 还是 zh_TW.UTF8 呢 01/28 00:15
41F:→ kenduest: 执行 locale 看一下 LANG 与 LC_ALL 变数确认一下 01/28 00:15
42F:→ kenduest: 目前这个年代应该不大会预设使用 zh_TW.Big5 这类编码 01/28 00:16
43F:→ kenduest: 不过还是可以确认一下比较好确认问题点 01/28 00:17
44F:→ kenduest: 至於楼上其他朋友提到 convmv 主要是解决档名的编码 01/28 00:17
45F:→ kenduest: 与所处使用的语系编码不同的档案名称修改工具 01/28 00:18
46F:→ kenduest: 一般大多用於 file server 可能以往是使用 Big5 的编码 01/28 00:18
47F:→ kenduest: 後续系统预设 locale 改成 utf8 这类,系统的程式要 01/28 00:18
48F:→ kenduest: 能够正常识别显示,尤其像是 samba 这类就显得重要 01/28 00:19
49F:→ JackBaska: 感谢两位大大的讲解,我设定是全utf8,convmv我有看过讨 01/28 00:29
50F:→ JackBaska: 论改档名的事情,只是我需要的是批量改档名,所以我还在 01/28 00:29
51F:→ JackBaska: 摸索,由於取得资料的资料源全都是万恶MS的big5,最小单 01/28 00:31
52F:→ JackBaska: 位的资料大概都会到30档案,每个档案约有数万比资料 01/28 00:31
53F:→ JackBaska: 所以小弟linux新手得越级打怪 QQrz 我是先手动转档处理 01/28 00:32
54F:→ JackBaska: 很迫切要的前二十多份,但类似的问题我觉得还会遇到所以 01/28 00:33
55F:→ JackBaska: 有点越级打怪还是来跟大家请教了 QQ 01/28 00:33
56F:→ JackBaska: 虽然可以load到python里面然後再做转档,但我目前试速度 01/28 00:35
57F:→ JackBaska: 最快效果最好的方式是直接让shell叫,用shell default的 01/28 00:35
58F:→ JackBaska: 语系跳过python我要处理open read & write的问题直接转 01/28 00:36
59F:→ kenduest: 不过还是没看出来你转档失败的主要问题点在哪 01/28 00:43
60F:→ kenduest: 目前你 script 改好程式码内容怎样,执行跑有错误吗 01/28 00:44
61F:→ kenduest: 那错误讯息要给一下要不然还是有点困惑 01/28 00:44
62F:→ kenduest: 看不出来是 shell script 还是 python script 的问题 01/28 00:45
63F:→ JackBaska: 它输出 xlsx2csv 出现执行错误,而执行喷错内容就是常见 01/28 00:46
64F:→ JackBaska: 的big5码,并表示这些字元在里面是不允许的,所以我觉得 01/28 00:47
65F:→ JackBaska: 是档名编码问题,过去传资料进方法或函数跳此类错误都是 01/28 00:48
66F:→ JackBaska: 把encoding处理好就解掉了 01/28 00:48
67F:→ kenduest: 所以你系统还是使用 big5 的 locale 环境? 01/28 00:55
68F:→ JackBaska: UTF8是资料源的机构是全面big5+excel,两个让我头大的 01/28 01:35
69F:→ JackBaska: 东西,big5 要转码 excel会把读档时间拉长 01/28 01:36
70F:→ JackBaska: 所以我是在系统内直接做转档,因为我default是utf8所以 01/28 01:36
71F:→ JackBaska: xlsx2csv会自动帮我转成utf8 01/28 01:37
72F:→ JackBaska: 第一句话没打好 我是utf8 取资料单位是全面big5 01/28 01:38
73F:推 Hevak: 「which xlsx2csv」看看那东西到底有没有在你新写的PATH里? 01/28 07:30
74F:→ Hevak: 也可以先在script内「source ~/.bashrc」看看能不能正常跟 01/28 07:31
75F:→ Hevak: terminal一样动,这个指令就是载入你的.bashrc那些变数 01/28 07:31
76F:→ Hevak: 放在行头可能有效,不肯定@@ 01/28 07:32
77F:→ Hevak: 档头第1行 01/28 07:32
78F:→ JackBaska: 感谢H大,不过PATH的问题已经解了,现在在解中文档名编码 01/28 08:13
※ 编辑: JackBaska (140.109.196.140), 02/01/2016 17:21:18
79F:→ CP64: 呃 後来查了一下 设定 PATH 的地方不用 sudo 02/02 00:32
80F:→ CP64: 也不能用 sudo 因为那是 bash 的内建功能 sudo 不吃 02/02 00:32
81F:→ CP64: 之前那边误导到了不好意思 @@ 02/02 00:32
82F:→ CP64: 就只要 PATH=$PATH:~/bin; export PATH; 就可以了 02/02 00:43
83F:→ CP64: 如果说要确定 sudo 有吃到你前面下的变数用 sudo -E 02/02 00:44