Shell

為什麼我對 ls 輸出的循環不起作用?

  • May 28, 2014

我正在嘗試將目錄名稱輸入 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 循環對三個目錄執行三次:

  1. 2014-02-02 - 傑比 (
  2. 2014-02-04 - 傑比 (
  3. @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

引用自:https://unix.stackexchange.com/questions/128788