1. 程式人生 > >bash下處理包含空格的檔名

bash下處理包含空格的檔名

今天在處理檔案時遇到個問題,當檔名包含空格時,for迴圈就出問題了。

例如,我在當前資料夾下建立3個檔名包含空格的檔案:
keakons-MacBook-Pro:test keakon$ touch "test 1"
keakons-MacBook-Pro:test keakon$ touch "test 2"
keakons-MacBook-Pro:test keakon$ touch "test 3"
keakons-MacBook-Pro:test keakon$ ls
test 1	test 2	test 3

然後for迴圈輸出檔名:
keakons-MacBook-Pro:test keakon$ for file in `ls`;
> do echo
$file; > done test 1 test 2 test 3
可以看到,檔名被分開了。

複製操作也不行:
keakons-MacBook-Pro:test keakon$ mkdir ../bak
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
cp: bak is a directory (not copied).
cp: test: No such file or directory
cp: 1: No such file or directory
cp: test: No such file or
directory cp: 2: No such file or directory cp: test: No such file or directory cp: 3: No such file or directory

要解決這個問題,當然就要從單詞分隔符著手。而bash中使用的是$IFS(Internal Field Separator)這個變數,內容為" \n\t":
keakons-MacBook-Pro:test keakon$ echo $IFS

keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0
a 0a 0000004 keakons-MacBook-Pro:test keakon$ echo "" | od -t x1 0000000 0a 0000001

然後把它改成"\n\b",記得修改前先儲存一下:
keakons-MacBook-Pro:test keakon$ SAVEIFS=$IFS
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en "\n\b")

現在再執行上述命令就正常了:
keakons-MacBook-Pro:test keakon$ for file in `ls`; do echo $file; done
test 1
test 2
test 3
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
keakons-MacBook-Pro:test keakon$ ls ../bak
test 1	test 2	test 3

最後,別忘了恢復$IFS:
keakons-MacBook-Pro:test keakon$ IFS=$SAVEIFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0a  0a                                                
0000004
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en " \n\t")
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  0a  09  0a