Bash inline Problem mit Leerzeichen



  • Hallo Zusammen!

    Ich habe ein Programm(lscoreless), welches mir eine Reihe von Dateien ausgibt. Ich würde gerne zum Beispiel sowas zum laufen bringen:

    rm -i `./lscoreless -o *`
    

    bzw.

    ls `./lscoreless -o *`
    

    Leider funktioniert das bei Dateien nicht, die Leerzeichen enthalten. Und egal wie ich es formatiere! Das ist das komische ... Es ist egal ob ich die Ausgabe in ' setze oder die Leerzeichen mit \ versehe...
    **
    Keine Leerzeichen**

    $ [b]./lscoreless -o *[/b]
    [b]filewithoutspaces.txt[/b] $ [b]rm -i `./lscoreless -o *`[/b]
    rm: remove symbolic link `filewithoutspaces.txt'? [b]n[/b]
    

    Mit Leerzeichen

    $ [b]./lscoreless -o *[/b]
    [b]file\ with\ spaces.txt[/b] $ [b]rm -i `./lscoreless -o *`[/b]
    rm: cannot remove `file\\': No such file or directory
    rm: cannot remove `with\\': No such file or directory
    rm: cannot remove `spaces.txt': No such file or directory
    
    $ [b]./lscoreless -O *[/b]
    [b]'file with spaces.txt'[/b] $ [b]rm -i `./lscoreless -O *`[/b]
    rm: cannot remove `\'file': No such file or directory
    rm: cannot remove `with': No such file or directory
    rm: cannot remove `spaces.txt\'': No such file or directory
    
    $ [b]./lscoreless -oO *[/b]
    [b]'file\ with\ spaces.txt'[/b] $ [b]rm -i `./lscoreless -oO *`[/b]
    rm: cannot remove `\'file\\': No such file or directory
    rm: cannot remove `with\\': No such file or directory
    rm: cannot remove `spaces.txt\'': No such file or directory
    

    Was mach ich falsch? 😞



  • Das Problem ist, dass die Backticks genau einen Parameter erzeugen.

    rm `ls *.txt`
    

    geht ja auch nicht mit Leerzeichen. Die patterns werden ja von der shell expandiert, bevor rm aufgerufen wird. Du brauchst also noch eine weitere indirektion. Das beispielsweise:

    eval rm `ls *.txt|sed 's_ _\\\\ _g'`
    

    Das ls erzeugt eine Dateiliste mit Zeilenschaltung getrennt. Das sed ersetzt die Leerzeichen durch Backslash-Leerzeichen. Damit hast Du mit dem rm erst mal das, was Du auf der Kommandozeile eingeben würdest. Damit das ganze noch mal von der shell angepackt wird, wird noch ein eval hinterhergeschickt.



  • Vielen Dank für die schnelle Antwort!

    Wenn ich das richtig verstehe, kann ich also ausgeben was ich will, immer wenn Leerzeichen im Spiel sind, komme ich um eine modifizierte Bashanweisung (sed) nicht herum?

    Warum kann ich dann nicht das schreiben was sed schreibt?



  • man: xargs ist die Lösung für so etwas

    ./lscoreless -o * | xargs -d '\n' rm
    

    (Wenn du das Programm ändern kannst, solltest du aber lieber die Dateinamen mit \0 trennen (zumindest einen Modus dafür anbieten) und dann xargs -0 benutzen)



  • Danke euch beiden!

    Das mit den xargs und null-separator ist wohl die unkomplizierteste Lösung ...


Anmelden zum Antworten