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:
- 02/02/2014 - Jebby (
- 04/02/2014 - Jebby (
- @eaDir
O que estou fazendo de errado?
Responder1
Evite analisar a saída (ou pelo menos a parte do nome do arquivo) ls
em 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 ls
comando 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