Por que meu loop na saída de ls não funciona?

Por que meu loop na saída de ls não funciona?

Estou tentando inserir nomes de diretório em um loop for. Meu código é o seguinte:

td='/Test/TopDir/'
cd "$td" 
for x in $(ls -d */ | cut -f1 -d'/'); do
  echo x=$x
done

O diretório superior em que executo isso fica assim ao executar um comando 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

Os resultados do meu loop for são os seguintes:

x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir

Como você pode ver, o loop for divide os nomes dos diretórios em subpartes após cada espaço. Neste exemplo, quero apenas que o For Loop seja executado três vezes com os três diretórios:

  1. 02/02/2014 - Jebby (
  2. 04/02/2014 - Jebby (
  3. @eaDir

O que estou fazendo de errado?

Responder1

Evite analisar a saída (ou pelo menos a parte do nome do arquivo) lsem scripts shell, se possível.Sempre haverá problemas com a divisão de palavras onde os nomes dos arquivos contêm espaços em branco.

Se você quiser iterar sobre diretórios, você pode fazer isso usando um simples shell glob, ou seja

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

O lscomando só deve ser usado para exibir listagens de diretórios em formato legível no terminal.

Responder2

Usando @mikserv'ssugestão, você pode fazer

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

informação relacionada