4 votos

¿Cómo analizar rutas de archivo separadas por un espacio en una cadena?

Antecedentes: estoy trabajando en Automator en un contenedor a una utilidad de línea de comandos. Necesito una manera de separar un número arbitrario de rutas de archivo delimitado por un espacio de una sola cadena, por lo que me pueden quitar todo, pero la primera ruta de acceso de archivo para pasar al programa.

Ejemplo de la cadena de entrada:

/Users/bobby/diddy dum/ding.mp4 /Users/jimmy/gone mia/come back jimmy.mp3 ...

Salida deseada:

/Users/bobby/diddy dum/ding.mp4

Parte del problema es la falta de flexibilidad en el Automator final de las cosas. Estoy usando una acción de Automator que devuelve sin escape POSIX las rutas de los archivos delimitados por un espacio (o coma). Esto es desafortunado porque: 1. No puedo asegurar archivo/carpeta los nombres no contienen un espacio o una coma, y 2. el único inadmisible personaje en Mac OS X nombres de archivo (como lo que puedo decir) :. Hay opciones que me permite adjuntar el archivo de rutas de acceso en doble o individual comillas o paréntesis angulares. El programa en sí acepta el argumento de la mencionada cadena de entrada, por lo que debe haber una forma de separar los caminos. Yo simplemente no tienen una suficientemente agudo ojo para ver cómo hacerlo con sed o awk.

Al principio pensé que sólo voy a usar sed a reemplazar cada [space]/ con [newline]/ y, a continuación, recortar todo, pero la primera línea, pero que deja un resquicio abierto para las carpetas cuyos nombres terminan con un espacio. Si puedo usar el delimitador de coma, lo mismo pasa sólo por una coma en su lugar. Si me encapsular en comillas dobles o simples, yo soy de abrir otra caja de pandora para los nombres de archivo con esos personajes.

La imagen/enlace es la parte pertinente de mi flujo de trabajo de Automator.

-- UPDATE --

Yo era capaz de conseguir lo que quería de una forma indirecta. No es nada elegante, pero aquí está trabajando generalizada código:

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 este problema porque el defecto de IFS no cuenta el "vacío" entre los espacios como las palabras, sino que se derrumba todos ellos.

1voto

Abbas Puntos 3737

Este código de shell va a concatenar los segmentos de la entrada hasta que se forma un archivo válido (ruta) nombre:

archivo=""
sep=""
para la palabra en $path
¿
archivo="$archivo$sep$palabra"
 if [[ -f "$archivo" ]]
entonces
romper
fi
 sep=" "
hecho
echo "el primer archivo: '$archivo'"

Esto supone que el nombre de los archivos que ya existen (y su secuencia de comandos puede "ver"; es decir, puede buscar en los directorios a los que están en) y aún así no se si el nombre contiene múltiples espacios consecutivos (por ejemplo, "diddy dum" está bien, pero "diddy  dum" no lo es).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: