staging.inyokaproject.org

Bascript, leerzeichen in Pfad aus Liste

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

nieselfriem

Anmeldungsdatum:
1. November 2007

Beiträge: Zähle...

Hallo,

wenn man mit ls und der Autovervollstädnigung einen Pfad mit leerzeiche sich auflisten lässt, dan werden leerzeiche mit \ maskiert also /ich\ habe\ nervige\ leerzeichen Nun habe ich eine liste mit Pfaden, die ich in einer Loop abarbeiten will.

1
2
#!/bin/bash
for f in $(cat sqlfiles.txt); do cat "${f}"; done;

Jedoch scheitert er da an diesem Leerzeichen

cat: '/home/niesel/habe\': Datei oder Verzeichnis nicht gefunden
cat: 'nervige\': Datei oder Verzeichnis nicht gefunden
cat: leerzeichen/1.sql: Datei oder Verzeichnis nicht gefunden

sqlfiles.txt

...
/home/niesel/habe\ nervige\ leerzeichen\1.sql 
...

Obwohl ich den Pfad schon mit maskierung angeben habe. Gibt es da ein Trick in den Scripten?

VG niesel

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Dein Problem lässt sich recht einfach lösen:

1
2
3
4
5
6
$ cat sqlfiles.txt
/home/niesel/habe nervige leerzeichen1.sql
/home/niesel/habe nervige leerzeichen2.sql
$ xargs -rd \\n -a sqlfiles.txt printf '<%s>\n'
</home/niesel/habe nervige leerzeichen1.sql>
</home/niesel/habe nervige leerzeichen2.sql>

Achtung: Leerzeichen sind in der Datei nicht escaped.

Mit Deinem Format geht:

1
2
3
4
5
6
$ cat x
/home/niesel/habe\ nervige\ leerzeichen1.sql
/home/niesel/habe nervige leerzeichen2.sql
$ while read f; do echo "<$f>"; done <x
</home/niesel/habe nervige leerzeichen1.sql>
</home/niesel/habe nervige leerzeichen2.sql>

Statt echo und printf natürlich dann das Kommando, das Du brauchst (cat anscheinend).

nieselfriem

(Themenstarter)

Anmeldungsdatum:
1. November 2007

Beiträge: 66

Naja das Cat ist nur als Dummy da, da ich später psql ausführen will. Es geht mir ja nicht darum einfach nur den inhalt des textes auszugeben, sondern die sqls auszühren

1
 while read f; do echo "<$f>"; done <x

passt. Danke

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Wie erzeugst Du denn die Liste von SQL-Datei-Namen? Vielleicht gibt es auch noch eine andere Lösung. Z.B.

1
find /some/where -type f -iname \*.sql -exec psql -f {} db user \;

Oder Du spaltest das in zwei Schritte auf, wenn sich die Liste nicht oft ändert:

1
2
find /some/where -type f -iname \*.sql -print0 >sqlfiles.txt
xargs -r0a sqlfiles.txt -n 1 psql -f {} db user

Ich habe jetzt hier \0 als Trenner zwischen Argumenten verwendet, weil das am sobustesten ist.

Antworten |