在 Shell Script 中不太合法的檔案名稱的問題...

如果您覺得您的問題不屬於 debian desktop 或是 debian server 版的範圍內,請在這裡發問。

版主: mufa

在 Shell Script 中不太合法的檔案名稱的問題...

文章Tetralet » 週四 12月 18, 2003 11:34 am

我們在寫 Shell Script 時,常常要進行檔案的處理。
如果此時檔案名稱包含了空白 " " 或是負號 "-"、錢號 "$"、斜線 "/" 時,
後面指令就會出問題。

例:檔案名稱:"ABC DEF.jpg",要把它給刪掉...

代碼: 選擇全部
find ./ -name "ABC DEF.jpg" -print | xargs rm
rm: cannot remove ‘./ABC’: 沒有此一檔案或目錄
rm: cannot remove ‘DEF.jpg’: 沒有此一檔案或目錄


或是想用 sed 來替代字串時:
代碼: 選擇全部
$ sed -e "s/aaa/bbb/" Test.txt
bbb
bbb
ccc

$ String="aaa"
$ sed -e "s/$String/bbb/" Test.txt
bbb
bbb
ccc

$ String="/aaa/bbb"
$ sed -e "s/$String/bbb/" Test.txt
sed: -e expression #1, char 11: Unknown option to 's'



請教一下有什麼比較好的解決方法呢?

或者,有什麼指令可以把 "/aaa/bbb" 轉換成 "\/aaa\/bbb" 呢?
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:在 Shell Script 中不太合法的檔案名稱的問題...

文章twu2 » 週四 12月 18, 2003 2:07 pm

用 -printf 來加上 "" 吧.

find . -name "ABC DEF.jpg" -printf "\"%p\"\n" | xargs rm
twu2
懵懂的國中生
懵懂的國中生
 
文章: 219
註冊時間: 週二 3月 11, 2003 2:58 pm
來自: Taipei

re:在 Shell Script 中不太合法的檔案名稱的問題...

文章twu2 » 週四 12月 18, 2003 2:11 pm

另外, / 不是合法檔名吧. 如果是 -, 可以在指令之後加上 -- 再加上參數.
twu2
懵懂的國中生
懵懂的國中生
 
文章: 219
註冊時間: 週二 3月 11, 2003 2:58 pm
來自: Taipei

re:在 Shell Script 中不太合法的檔案名稱的問題...

文章Tetralet » 週四 12月 18, 2003 8:25 pm

twu2 寫:另外, / 不是合法檔名吧


但如果是 "/etc/hosts" 時,
那就可能要針對 "/" 這個字元特別處理了。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:在 Shell Script 中不太合法的檔案名稱的問題...

文章Tetralet » 週四 12月 18, 2003 8:25 pm

謝謝您的回覆!

基本上一些奇奇怪怪的檔名是可以用這些方法想辨法一個一個避過去,
但是我們在寫 Script 時就不得不考慮所有可能的狀況,
也就是所有不合法的檔案名稱我們的 Script 都必須能夠正確處理,
而這就是我想問的問題。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

Re: re:在 Shell Script 中不太合法的檔案名稱的問題...

文章訪客 » 週四 10月 19, 2006 1:05 am

Tetralet 寫:謝謝您的回覆!

基本上一些奇奇怪怪的檔名是可以用這些方法想辨法一個一個避過去,
但是我們在寫 Script 時就不得不考慮所有可能的狀況,
也就是所有不合法的檔案名稱我們的 Script 都必須能夠正確處理,
而這就是我想問的問題。


因為要從wav轉檔成mp3 所以寫了一支小script.

不過 我用了 ls 以及 上述所列方式. 發現都會 出現 newline 的情況. 該怎麼解決呢?

代碼: 選擇全部
for i in `ls *`
do
lame -h $i $i.mp3
done


代碼: 選擇全部
for i in `find . -name "*.wav" -print`
do
lame -h $i $i.mp3
done


其中 把 lame ... 改成 echo $i 發現
原檔名:
代碼: 選擇全部
ABC DEF.wav

shell script outpout:
代碼: 選擇全部
ABC
DEF.wav
123
456.wav
...



thanks in advance.
訪客
 

文章訪客 » 週四 10月 19, 2006 9:17 am

可以用 echo -n 去掉 newline
訪客
 

文章訪客 » 週四 10月 19, 2006 10:50 am

a=$(ls *wav); for i in "$a"; do echo "$a"; done
這樣是 OK 的!
訪客
 

文章kenshinn » 週四 10月 19, 2006 1:39 pm

我的作法是在這支script中加上
IFS=""
就可以了
my blog: http://www.wretch.cc/blog/kenshinn
operation system : Ubuntu 5.10 GNU/linux
window manager : XFCE4 + ROX
kenshinn
可愛的小學生
可愛的小學生
 
文章: 11
註冊時間: 週三 10月 05, 2005 6:42 pm

文章訪客 » 週四 10月 19, 2006 2:01 pm

我的作法是用 while 取代 for

find . -name "*.wav" -print | while read i
do
lame -h "$i" "$i".mp3
done
訪客
 


回到 debian misc

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron