[問題] 在bash裡面呼叫外部程式(已解:回饋script)

作者: JackBaska (Baska)   2016-01-27 17:38:08
=======問題已解 回饋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叫什麼) , 對小弟來說算是一個有趣
的應用,想問各位先進是否有做過這件事情 ???
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 18:04:00
for f in `ls -1 *.xlsx`do xlsx2cxv $f Test_convert/${f%.*}.csv問的是這種嗎 ?啊 少了 done關於字串改寫可以參考 bash manpage 的 Parameter Expansion
作者: tjjh89017 (伊達政宗)   2016-01-27 18:18:00
真不愧是CP64大師<(_ _)>
作者: JackBaska (Baska)   2016-01-27 20:55:00
感謝CP64大大,我可以叫到我要的檔案了,不過shell問題我還沒搞定,會一直顯示找不到 xlsx2csv的方法,我還在研究怎麼得到一般操作的完整shell PATH 資訊
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:13:00
你下個 sudo env 看輸出應該就會知道發生啥事了你的 sudo 吃不到你下的 PATH不過有點好奇有需要用 sudo 嗎? 何不產在 /tmp 再搬過去
作者: JackBaska (Baska)   2016-01-27 21:20:00
小弟算新手,最近越來越受不了windows的command怒切了點空間裝linux,大概用一個禮拜已經愛上了 XD最近還在拜讀鳥哥的文章,但其實很多觀念還在建立常常用sudo是因為有時候對一些指令還不熟悉,偏偏需要權限, 不過我現在還有點茫 因為兩個 PATH是一樣的
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:26:00
感覺轉換程式應該是不至於用到 sudo 的啊 不對 我看錯了一點東西
作者: JackBaska (Baska)   2016-01-27 21:27:00
path問題解掉了,現在在解令一個執行噴錯 XD另現在執行成功了,但原本的檔名encoding問題又回來了成功呼叫到xlsx2csv,但是檔名encoding問題跑出來了
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:33:00
現在是轉完的檔名會亂碼嗎? 還是檔名亂碼導致讀不到檔?
作者: JackBaska (Baska)   2016-01-27 21:34:00
檔名亂碼導致xlsx2csv在讀檔階段噴錯,我現在在查要怎麼在bash裡面做一部分字串的轉碼
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:36:00
建議用 iconv啊 應該是說用 convmv先把檔名轉一轉
作者: JackBaska (Baska)   2016-01-27 21:46:00
下午我在試時 iconv 我撞到xlsx不知道要怎麼處理 QQconvmv 是還沒弄懂下法 現在在試 QQ
作者: kenduest (小州)   2016-01-28 00:03:00
有幾個問題確認一下:1. 一開始問題,你 script 的變數語法宣告有問題PATH=path1:path2:path3 這樣子,= 符號兩邊不可以空白2. 你改了 PATH 變數,不一定會讓 sudo 執行時候套用不小心按到「噓」的選項 -.-"3. sudo 的 PATH 很多解法,一般最簡單可以改目的帳號的 shell 設定檔案設定,後續使用 sudo -i 方式來執行吃目的身份的 shell 初始化環境設定配置就可以了4. 你的當下語系是 zh_tw.Big5 還是 zh_TW.UTF8 呢執行 locale 看一下 LANG 與 LC_ALL 變數確認一下目前這個年代應該不大會預設使用 zh_TW.Big5 這類編碼不過還是可以確認一下比較好確認問題點至於樓上其他朋友提到 convmv 主要是解決檔名的編碼與所處使用的語系編碼不同的檔案名稱修改工具一般大多用於 file server 可能以往是使用 Big5 的編碼後續系統預設 locale 改成 utf8 這類,系統的程式要能夠正常識別顯示,尤其像是 samba 這類就顯得重要
作者: JackBaska (Baska)   2016-01-28 00:29:00
感謝兩位大大的講解,我設定是全utf8,convmv我有看過討論改檔名的事情,只是我需要的是批量改檔名,所以我還在摸索,由於取得資料的資料源全都是萬惡MS的big5,最小單位的資料大概都會到30檔案,每個檔案約有數萬比資料所以小弟linux新手得越級打怪 QQrz 我是先手動轉檔處理很迫切要的前二十多份,但類似的問題我覺得還會遇到所以有點越級打怪還是來跟大家請教了 QQ雖然可以load到python裡面然後再做轉檔,但我目前試速度最快效果最好的方式是直接讓shell叫,用shell default的語系跳過python我要處理open read & write的問題直接轉
作者: kenduest (小州)   2016-01-28 00:43:00
不過還是沒看出來你轉檔失敗的主要問題點在哪目前你 script 改好程式碼內容怎樣,執行跑有錯誤嗎那錯誤訊息要給一下要不然還是有點困惑看不出來是 shell script 還是 python script 的問題
作者: JackBaska (Baska)   2016-01-28 00:46:00
它輸出 xlsx2csv 出現執行錯誤,而執行噴錯內容就是常見的big5碼,並表示這些字元在裡面是不允許的,所以我覺得是檔名編碼問題,過去傳資料進方法或函數跳此類錯誤都是把encoding處理好就解掉了
作者: kenduest (小州)   2016-01-28 00:55:00
所以你系統還是使用 big5 的 locale 環境?
作者: JackBaska (Baska)   2016-01-28 01:35:00
UTF8是資料源的機構是全面big5+excel,兩個讓我頭大的東西,big5 要轉碼 excel會把讀檔時間拉長所以我是在系統內直接做轉檔,因為我default是utf8所以xlsx2csv會自動幫我轉成utf8第一句話沒打好 我是utf8 取資料單位是全面big5
作者: Hevak (Arthow Eshes)   2016-01-28 07:30:00
「which xlsx2csv」看看那東西到底有沒有在你新寫的PATH裡?也可以先在script內「source ~/.bashrc」看看能不能正常跟terminal一樣動,這個指令就是載入你的.bashrc那些變數放在行頭可能有效,不肯定@@檔頭第1行
作者: JackBaska (Baska)   2016-01-28 08:13:00
感謝H大,不過PATH的問題已經解了,現在在解中文檔名編碼
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-02-02 00:32:00
呃 後來查了一下 設定 PATH 的地方不用 sudo也不能用 sudo 因為那是 bash 的內建功能 sudo 不吃之前那邊誤導到了不好意思 @@就只要 PATH=$PATH:~/bin; export PATH; 就可以了如果說要確定 sudo 有吃到你前面下的變數用 sudo -E

Links booklink

Contact Us: admin [ a t ] ucptt.com