Como manipular espaços em nomes de caminhos quando a variável contém vários caminhos [duplicados]

2

Embora eu tenha lido a maior parte das perguntas sobre como lidar com espaços em nomes de caminhos, ainda não encontrei meu caso, que é sobre vários nomes de caminho em uma variável.

find precisará disso quando dois caminhos base forem fornecidos, por exemplo:

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 

Isso procurará correspondências em ambos folder1 e folder2 .

(Observe que este é um exemplo simplificado ; sei muito bem que neste caso especial, você poderia usar o modificador -path com um parâmetro como folder* que abrange Ambas as pastas. No entanto, esta questão é para cobrir casos em que você não pode contornar o problema tão facilmente devido à maior complexidade.)

Agora imagine folder2 contém um espaço no meio. Os seguintes itens não funcionarão:

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 

O problema é o \ , que normalmente é usado para representar um espaço no shell, mas não funciona quando o conteúdo da variável é colocado entre aspas duplas. No entanto, diferentemente do caminho um por variável (onde pode ser útil), o seguinte não funcionará:

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

nem a seguinte variante:

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 

Então, como os espaços podem ser manipulados adequadamente em caminhos se vários caminhos estiverem contidos em uma variável?

Pergunta relacionada: Existe alguma maneira confiável de determinar se um espaço em branco é um separador entre um caminho e seu sucessor (dentro da mesma variável) ou um espaço em branco que pertence a um dos caminhos contidos nele?

    
por syntaxerror 06.02.2015 / 23:52

2 respostas

5

Use bash arrays:

pa=("/home/user/folder1" "/home/user/fol der2")
find "${pa[@]}" -name '*xy*' ... 

Discussão

Observe que \ não faz o que se espera:

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2

O \ na definição de pa se torna um caractere literal na string, não um escape. Se você quiser uma lista de strings separadas, use uma matriz.

    
por 06.02.2015 / 23:59
0

Use uma variável de matriz e coloque um valor de caminho em cada elemento da matriz. Se isso realmente não for possível, outra abordagem seria usar algo diferente de espaço como seu separador de itens.

p[0]="hello"
p[1]="happy"
p[2]="world"

echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}"

for p in "${p[@]}"
do
    echo "p=$p."
done

Etc.

    
por 06.02.2015 / 23:59