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 ループが 3 つのディレクトリに対して 3 回だけ実行されるようにします。

  1. 2014-02-02 - JB(
  2. 2014-02-04 - JB(
  3. @eaDir

私は何が間違っていましたか?

答え1

ls可能であれば、シェルスクリプトの出力(または少なくともファイル名の一部)を解析しないでください。ファイル名にスペースが含まれている場合は、常に単語分割の問題があります。

ディレクトリを繰り返すには、単純なシェル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

関連情報