Background: Estou trabalhando no Automator em um wrapper para um utilitário de linha de comando. Eu preciso de uma maneira de separar um número arbitrário de caminhos de arquivos delimitados por um único espaço de uma única string, para que eu possa remover todos, mas o primeiro caminho de arquivo para passar para o programa.
Sequência de entrada de exemplo:
/Users/bobby/diddy dum/ding.mp4 /Users/jimmy/gone mia/come back jimmy.mp3 ...
Saída desejada:
/Users/bobby/diddy dum/ding.mp4
Parte do problema é a inflexibilidade do fim das coisas do Automator. Eu estou usando uma ação do Automator que retorna filepaths POSIX sem escape delimitados por um espaço (ou vírgula). Isso é lamentável porque: 1. Não posso garantir que os nomes de arquivos / pastas não contenham espaço ou vírgula e 2. o único caractere inadmissível nos nomes de arquivos do Mac OS X (até onde eu saiba) seja :
. Existem opções que me permitem colocar os caminhos de arquivo entre aspas duplas ou simples, ou colchetes angulares. O próprio programa aceita o argumento da cadeia de entrada mencionada anteriormente, portanto, deve haver uma maneira de separar os caminhos. Eu simplesmente não tenho muita atenção para ver como fazer isso com sed
ou awk
.
Primeiro, pensei em usar apenas sed
para substituir todos os [space]/
por [newline]/
e depois aparar todos, exceto a primeira linha, mas isso deixaria a brecha aberta para pastas cujos nomes terminassem com um espaço. Se eu usar o delimitador de vírgula, o mesmo acontece, apenas para uma vírgula. Se eu encapsular entre aspas duplas ou simples, estou abrindo outra lata de worms para nomes de arquivos com esses caracteres.
Esta é a parte relevante do meu fluxo de trabalho do Automator:
-ATUALIZAÇÃO-
Conseguialcançaroquequeriadeumaformabastanteindireta.Nãoéelegante,masaquiestátrabalhandocódigogeneralizado:
path="/Users/bobby/diddy dum/ding.mp4 /Users/jimmy/gone mia/come back jimmy.mp3"
# using colon because it's an inadmissible Mac OS X
# filename character, perfect for separating
# also, unlike [space], multiple colons do not collapse
IFS=:
# replace all spaces with colons
colpath=$(echo "$path" | sed 's/ /:/g')
# place words from colon-ized file path into array
# e.g. three spaces -> three colons -> two empty words
j=1
for word in $colpath
do
filearray[$j]="$word"
j=$j+1
done
# reconstruct file path word by word
# after each addition, check file existence
# if non-existent, re-add lost [space] and continue until found
name=""
for seg in "${filearray[@]}"
do
name="$name$seg"
if [[ -f "$name" ]]
then
echo "$name"
break
fi
name="$name "
done
Todo esse problema, porque o IFS padrão não conta "vazio" entre os espaços como palavras, mas colapsa todos eles.