Почему мой цикл по выводу 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-глоба, например:

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

Связанный контент