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 ループは各スペースの後のディレクトリ名をサブピースに分割しています。この例では、3 つのディレクトリで For ループを 3 回だけ実行します。

  1. 2014-02-02 - ジェビー (
  2. 2014-02-04 - ジェビー (
  3. 翻訳者

何が間違っているのでしょうか?

答え1

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

ディレクトリを反復処理したい場合は、単純なシェルグロブを使用して実行できます。

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

関連情報