Como faço para analisar caminhos de arquivos separados por um espaço em uma string?

4

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.

    
por user1130637 18.09.2012 / 02:10

1 resposta

1

Este código concatenará segmentos da entrada até formarem um nome válido de arquivo (caminho):

file=""
sep=""
for word in $path
do
    file="$file$sep$word"
    if [[ -f "$file" ]]
    then
        break
    fi
    sep=" "
done
echo "first file: '$file'"

Isso pressupõe que os arquivos nomeados já existam (e seu script pode "vê-los"; isto é, pode pesquisar os diretórios nos quais eles estão) e ainda falhará se um nome contiver vários espaços consecutivos (por exemplo, " diddy dum "está OK, mas" diddy  dum "não é).

    
por 18.09.2012 / 02:40