Shell
為什麼我對 ls 輸出的循環不起作用?
我正在嘗試將目錄名稱輸入 for 循環。我的程式碼如下:
td='/Test/TopDir/' cd "$td" for x in $(ls -d */ | cut -f1 -d'/'); do echo x=$x done
執行 ls 命令時,我在其上執行的頂級目錄如下所示:
ls -l drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby ( drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby ( drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir -rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG -rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG
我的for循環的結果如下:
x=2014-02-02 x=- x=Jebby x=( x=2014-02-04 x=- x=Jebby x=( x=@eaDir
如您所見,for 循環在每個空格之後將目錄名稱分解為子片段。在此範例中,我只希望 For 循環對三個目錄執行三次:
- 2014-02-02 - 傑比 (
- 2014-02-04 - 傑比 (
- @eaDir
我究竟做錯了什麼?
ls
盡可能避免解析 shell 腳本的輸出(或至少是文件名部分) 。它總是會出現文件名包含空格的分詞問題。如果你想遍歷目錄,你可以使用一個簡單的 shell glob 來做到這一點,即
for d in */; do echo "$d" done
該
ls
命令只能用於在終端中以人類可讀的形式顯示目錄列表。
使用@mikserv 的建議,你可以做
cd /Test/TopDir/ set -- "$PWD" */ cd /somewhere/else td=$1 ; shift for x; do echo x="${td}/$x" done