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

為什麼我的 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 迴圈對三個目錄執行三次:

  1. 2014-02-02 - 傑比 (
  2. 2014-02-04 - 傑比 (
  3. @eaDir

我究竟做錯了什麼?

答案1

ls如果可能的話,請避免解析 shell 腳本中的輸出(或至少是檔案名稱部分) 。當檔案名稱包含空格時,它總是會出現分詞問題。

如果你想迭代目錄,你可以使用一個簡單的 shell glob 來實現,即

for d in */; do 
  echo "$d"
done

ls命令只能用於在終端機中以人類可讀的形式顯示目錄列表。

答案2

使用@mikserv的建議, 你可以做

cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift 
for x; do
  echo x="${td}/$x"
done

相關內容