Não analise a saída de ls
. Você não precisa do ls
para listar o conteúdo de um diretório: você pode usar curingas do shell.
Quando você escreve $(ls $LOCATION)
, a saída do comando ls
é dividida em palavras separadas onde quer que haja espaço em branco. É por isso que seu comando desconfiou nomes de arquivos com espaços. Você pode modificar a variável IFS
para evitar que os espaços sejam considerados separadores, mas não há como distinguir entre uma nova linha que separa nomes de arquivos de uma nova linha em um nome de arquivo, portanto não é possível evitar completamente o problema. Além disso, cada palavra resultante da divisão é tratada como glob (ou seja, um padrão de caractere curinga) e substituída pela lista de arquivos correspondentes, se houver. Uma regra simples de script de shell é: sempre coloca aspas duplas em torno das substituições de variáveis "$foo"
e substituições de comandos "$(foo)"
. As aspas duplas impedem a divisão e globbing.
O snippet a seguir é equivalente ao seu loop, exceto pelo fato de não manchar os nomes dos arquivos e imprimir o caminho completo para cada arquivo.
for x in "$LOCATION"/*; do
echo "$x"
done
Se você quiser o caminho relativo a $LOCATION
, uma maneira é mudar primeiro para o diretório de destino.
cd "$LOCATION"
for x in *; do
echo "$x"
done
Outra maneira é remover o prefixo do nome do arquivo.
for full_path in "$LOCATION"/*; do
relative_name=${full_path#"$LOCATION/"}
echo "$relative_name"
done
Imprime o nome de todos os arquivos no diretório de destino. Se você quiser apenas listar subdiretórios (incluindo links simbólicos para diretórios), adicione um /
ao padrão glob para restringir as correspondências.
for full_path in "$LOCATION"/*/; do
relative_name=${full_path#"$LOCATION/"}
relative_name=${relative_name%/}
echo "$relative_name"
done
Se você não quiser que os links simbólicos sejam incluídos, faça um teste explícito para um diretório dentro do loop.
for full_path in "$LOCATION"/*/; do
if ! [ -d "$full_path" ]; then continue; fi
relative_name=${full_path#"$LOCATION/"}
relative_name=${relative_name%/}
echo "$relative_name"
done