Dateiname mit Leerzeichen im Shellscript behandeln

397
whitebear

Dies ist meine Ordnerstruktur.

[set symbolic links here] /links/  [entity]  /data/a 1/ #(folder name has blank) /data/b 1/ /data/c 1/ /data/d 1/ . . . 

Ich möchte für jedes Objekt auf einmal per Shellscript eine symbolische Verbindung herstellen.

for file in /data/*; do echo "$" ln -ds "/data/$" "/links/$" done 

Es zeigt jedoch den Fehler so.

/data/a 1 ln: failed to create symbolic link '/data//links/a 1': No such file or directory 

Ich denke, ist relevant mit Leerzeichen im Ordnernamen .... ???

Wie kann ich das lösen?

1
Fügen Sie einfach Dateinamen in Anführungszeichen ein. ** `ln -ds" / data / "$ " "" / link / "$ " "` **. C0deDaedalus vor 5 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

Sind Sie sicher, dass /data//links/a 1die Fehlermeldung angezeigt wird? Ich würde erwarten /links//data/a 1...

Leerzeichen sind nicht das Problem. Sehen Sie, was Sie echoIhnen gegeben haben. Dein String $fileenthält bereits /data/. Das Stück Code

"/data/$" "/links/$" 

fügt /data/oder /links/zu einer Zeichenfolge hinzu, wo /data/bereits

Die einfachste Lösung ist, überhaupt $filenicht enthalten zu machen /data/:

cd /data for file in *; do # the rest of your script # in general remember you're in a different dir now 

Alternativ können Sie for file in /data/*;den übermäßigen Teil später behalten und entfernen:

for file in /data/*; do file=$(basename "$file") # the rest of your script 

Die obige Lösung wird mehrere Prozesse erzeugen, da basenamees sich um eine separate ausführbare Datei handelt. Aus diesem Grund möchten Sie möglicherweise, dass die Shell selbst die Aufgabe erledigt:

for file in /data/*; do file="$" # the rest of your script 

Die Syntax $druckt, $fileaber die längste passende Zeichenfolge wird */von der Vorderseite entfernt. Der Effekt ist, dass es Ihnen das gibt, was nach dem letzten noch da ist /.

Ich benutze `cd 'am Anfang des Skripts und es funktioniert !! Vielen Dank für Ihre genaue Beschreibung. Ich sollte vorsichtiger sein. whitebear vor 5 Jahren 0