# Probleme bei Script mit Leerzeichen im Namen

## doedel

Hi,

ich habe vor einiger Zeit etwas über 1.000 3,5" und 5,25" Floppys mittels dd auf meinen Rechner gesichert und ab und zu landet davon etwas in einer VM. 

Da mir das jedoch zu aufwendig wird und ich bis auf die Boot-Disketten keine Images haben will, habe ich angefangen ein Script zu schreiben, welches mir die Dateien "entpacken" soll. 

Das Funktioniert auch soweit ganz gut, bis auf die Images, welche Leerzeichen und Klammern usw im Namen haben.

Bsp:

schneider_dos5.0_D1.img funktioniert ohne Probleme

Turbo C eigene progs (A-F).img funktioniert nicht. Dort legt er mir dann 5 Verzeichnisse an ("Turbo", "C", "eigene", "progs" und "(A-F)") und versucht die Datei (A-F).img zu mounten.

Da er bisher nur 142 Images von 1135 entpackt hat, weil die anderen alle Leerzeichen haben fällt ein Umbennen raus.

Das Script:

```

#!/bin/bash

mkdir loop      # ordner für loopback mount

for file in `ls *.img`

do

        mkdir `echo "$file" | cut -d "." -f 1`          # folder anlegen, selber name wie image datei nur ohne suffix

        sudo mount -o loop "$file" loop/                # image mounten

        cp -rv loop/* `echo "$file" | cut -d "." -f 1`  # dateien aus image kopieren

        sync

        sudo umount loop/

done

rmdir loop

```

Ich hab das $file schon extra in " " gesetzt, aber das bringt nichts... Hoffentlich kann mir da einer von euch weiterhelfen  :Smile: 

----------

## Christian99

 *doedel wrote:*   

> 
> 
> ```
> mkdir `echo "$file" | cut -d "." -f 1`          # folder anlegen, selber name wie image datei nur ohne suffix
> ```
> ...

 

das ergibt dir ja folgenden befehl:

```
mkdir datei name mit leerzeichen
```

du willst aber 

```
mkdir "datei name mit leerzeichen"
```

sprich du musst die ´´ in Anführungszeichen setzen (zusätzlich).

das selbe noch bei der cp zeile

----------

## doedel

Ich hab das jetzt so:

```

        mkdir "`echo "$file" | cut -d "." -f 1`"          # folder anlegen, selber name wie image datei nur ohne suffix

        cp -rv loop/* "`echo "$file" | cut -d "." -f 1`"  # dateien aus image kopieren 

```

aber habe immernoch das selbe Ergebnis wie oben...

----------

## disi

Ich wuerde folgendes versuchen, weil er anscheinend die Dateien nicht auseinanderhalten kann:

```
for file in `ls -1 *.img` 
```

Das listed eine Datei per Zeile...

//edit: tut nicht :/

----------

## doedel

Das ls -1 hab ich schon versucht, hätte ich vielleicht auch mal schreiben sollen, funktioniert ebenfall nicht - selbes Ergebnis.

Ich hab jetzt auch schon eine Weile nach diesem Problem gesucht - aber mir fällt noch nichtmal ein sinnvoller Suchbegriff dazu ein, da kann man schlecht was finden.

----------

## disi

Das wuerde funktionieren ist aber lol, naja  :Smile: 

```
for file in `ls *.txt | sed s/\ /\./g`;do;echo $file;done
```

Du muesstest dann eben das sed andersherum laufen lassen fuer den Ordner anlegen usw. etwa so:

```
mkdir `echo $file | sed s/./\ /g`
```

Wenn du moechtest, ansonsten nur fuer das einhaengen

//edit: Nimm underscore  :Smile: 

```
for file in `ls *.txt | sed s/\ /\_/g`;do;echo $file | sed s/_/\ /g;done
```

//edit: sieht dann so aus:

```
disi@disi-bigtop ~ % for file in `ls *.txt | sed s/\ /\_/g`;do;echo $file | sed s/_/\ /g;done

blubb test test.txt

disi@disi-bigtop ~ % ls *.txt

blubb test test.txt
```

----------

## py-ro

Dein Problem _ist_ dein ls, ls -1 und den IFS auf ein Newline setzen, dann sollte es passen.

Py

----------

## toralf

hilft folgender Ansatz weiter ? :

```
find . -type f -print0 | xargs -0 -I{} echo ich tu was mit "{}"

```

----------

## mv

Dein Code hat etliche Probleme: `ls -1 ...` macht schon mal alle Leerzeichen kaputt.

`...` sollte man nicht verwenden, wenn Zeilenenden am Schluss des Namens auftauchen könnten (und außerhalb von "..." hat es ebenfalls Probleme mit Leerzeichen)

Wenn Filenamen mit "-" beginnen, werden diese in etlichen Deiner Kommandos als Option behandelt.

Ansonsten ist Dein Code POSIX, so dass Du auch /bin/sh statt /bin/bash benutzen könntest:

```
#!/bin/sh

mkdir loop

for file in *.img

do   no_suffix="${file%.*}"

   mkdir -- "$no_suffix"

   sudo -- mount -o loop -- "$file" loop/

   cp -rv -- loop/* "$no_suffix"

   sync # Überflüssig, da umount das richtig behandeln sollte

   sudo umount loop/

done

rmdir loop

```

Stattt "loop" könnte man natürlich ein temporäres Directory benutzen und dieses auch in einer "trap" wieder löschen falls das Script unterwegs (etwa mit Ctrl-C) abgebrochen werden sollte...

----------

