Dateinamen escapen bei übergabe an funktion

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2521
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Dateinamen escapen bei übergabe an funktion

Beitrag von reox » 16.10.2016 18:59:54

Hi!
Ich hab ein script welches ungefähr so ausschaut:

Code: Alles auswählen

function foo {
    // Mach irgendwas
    stat "$1"
}

find ./ -not -type d -print0 | while read -d $'\0' file; do
    foo "$file"                                                                                                      
done
Das problem machen mir jetzt ganz exotische dateinamen, welche backslashes in kombination mit escapebaren chars haben, zB"

Code: Alles auswählen

.foo\run\blablabla.txt
Denn scheinbar werden die backslashes herausgenommen, obwohl doch die variable mit hochkomma an die funktion weitergegeben wird?
Ergebnis ist dann:
stat: cannot stat './.foorunblablabla.txt': No such file or directory

Das hier hilft mir auch nicht: http://stackoverflow.com/a/1934478/446140
weil dann der \r interpretiert wird und nicht \\:

Code: Alles auswählen

$ while read -d '' -r file; do echo "$file"; printf -v name "%q" "$file"; echo "$name"; done< <(find -print0)
.
-v
ulablabla.txt
-v

$ find -print0 | while read -d '' -r line; do echo -en "--[${line}]--\t\t"; echo "$line"|sed -e ':t;N;s/\n/\\n/;bt' | sed 's/\([ \o47()"&;\\]\)/\\\1/g;s/\o15/\\r/g'; done
--[.]--         .
ulablabla.txt]--                ./.foo\rulablabla.txt
Gibt es keine variante wie man Dateinamen sinnvoll weitergibt, selbst wenn da die wildesten escape konstrukte drin sind?

edit: Scheinbar scheint das hier stabil zu funktionieren:

Code: Alles auswählen

function foo {
    // Mach irgendwas
    stat "$1"
}

find ./ -not -type d -print0 | while IFS= read -r -d '' file; do
    foo "$file"                                                                                                      
done
dH nur das -r verhindert das?

Antworten