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

5

Estou tentando alimentar nomes de diretórios 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 principal em que eu executo isso se parece com isso 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 quebra os nomes dos diretórios em sub-partes 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. 2014-02-02 - Jebby (
  2. 2014-02-04 - Jebby (
  3. @eaDir

O que estou fazendo de errado?

    
por Wags 10.05.2014 / 15:59

2 respostas

16

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

Se você quiser iterar através de diretórios, você pode fazer isso usando um simples shell glob, ou seja,

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

O comando ls deve ser usado apenas para exibir listagens de diretório em formato legível no terminal.

    
por 10.05.2014 / 16:29
2

Usando o @ mikserv sugestão , você pode fazer

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