ubuntuusers.de

Leerzeichen im Pfad

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

6apnditsnq

Anmeldungsdatum:
24. April 2015

Beiträge: 33

Hallo nochmal,

nach einer Akzeptanzanalyse musste ich feststellen, das Leerzeichen im Dateipfad Probleme bereiten. Mein Skript teil:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
prompt="Please select a file:"
		options=( $(find . /media -iname '*.iso' -print0 | xargs -0) )

		PS3="$prompt "
		select opt in "${options[@]}" "Neue Suche." ; do 
			if (( REPLY == 1 + ${#options[@]} )) ; then
				break

			elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
				echo  "You picked $opt which is file $REPLY"
				iso=$opt
				break

			else
				echo "Invalid option. Try another one."
			fi
		done    

Wie man erkennen kann, suche ich alle iso- Dateien und stelle eine Auswahl der gefundenen Dateien zur Auswahl. Das Problem ist wenn eine Datei ein Leerzeichen im Pfad hat, erscheinen zwei Optionen pro Datei in der Liste. Bei zwei Dateien "eine_Datei.iso" und "mit Leerzeichen.iso" sieht die Auswahl dann so aus:

1) ./Desktop/eine_Datei.iso  3) Leerzeichen.iso
2) ./Desktop/mit	     4) Neue Suche

Ich habe versucht bei der Variable options Anführungszeichen einzubauen, aber das führte nicht zum Erfolg. Wahrscheinlich sind Leerzeichen die Trennzeichen in der options, obwohl bei xargs -0 mit NULL getrennt wird? xargs (Abschnitt „Optionen“)

Ich möchte mit der ISO dann weiterarbeiten.

(Die Dateien kann ich nicht umbenennen (read only) und zur Not setzte ich halt Softlinks.)

LG Jake

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Frei nach http://mywiki.wooledge.org/BashFAQ/020 kann man diesen Weg nutzen, um eine Array mit null-terminierten Strings zu füllen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
prompt="Please select a file:"

PS3="$prompt "

unset options i
while IFS= read -r -d $'\0' file; do
    options[i++]="$file"        # or however you want to process each file
done < <(find . /media -iname '*.iso' -print0)

select opt in "${options[@]}" "Neue Suche." ; do
        if (( REPLY == 1 + ${#options[@]} )) ; then
                break

        elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
                echo  "You picked $opt which is file $REPLY"
                iso=$opt
                break

        else
                echo "Invalid option. Try another one."
        fi
done

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13208

Hier noch ein anderer Ansatz:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

test $# -eq 0 -o "$1" != @ && exec find . /media -iname '*.iso' -exec "$0" @ {} +
shift

prompt="Please select a file:"
PS3="$prompt "

select opt in "$@" "Neue Suche." ; do 
  if (( REPLY == 1 + $# )) ; then
    break
  elif (( REPLY > 0 && REPLY <= $# )) ; then
    echo  "You picked $opt which is file $REPLY"
    iso="$opt"
    break
  else
    echo "Invalid option. Try another one."
  fi
done

Er beruht darauf, dass man diesen Prozess überlagert mit einem find, der dann dasselbe Skript noch einmal mit den gefundenen Dateien als Argumente aufruft. Man nutzt also nicht $options sondern $@ (die Prozessargumente) um die Suchergebnisse aufzusammeln.

6apnditsnq

(Themenstarter)

Anmeldungsdatum:
24. April 2015

Beiträge: 33

Dankeschön. Es funktioniert ☺

Frohe Weihnacht!

Antworten |