# Suchen & Ersetzen auf Konsolenebene [solved]

## Lenz

Hallo,

ich habe für mein Notebook von meinem FLAC-Musikarchiv ein schlankeres Abbild im Ogg-Vorbis-Format erstellt. Soweit alles perfekt, nur steht in den Playlisten noch die Dateiendung der Stücke auf .flac. Da gibt es doch sicherlich eine Möglichkeit, diese automatisiert in .ogg abzuändern, oder? Irgendwie so eine Art Suchen & Ersetzen auf Konsolenebene, ohne jede einzelne Datei in einen Editor laden zu müssen.

Gruß,

Lenz.

----------

## firefly

das müsste recht einfach mit sed und konsorten gehen.

mit sed müsste das in etwa so aussehen:

```
sed "s/.flac/.ogg/g" <dateiname> > <tempdatei>

mv <tempdatei> <dateiname>
```

----------

## Lenz

Hört sich gut an, nun müsste ich das nur noch so kombinieren, dass er aus /mnt/media/Audio alle .m3u Dateien sucht und diesen Befehl auf diese anwendet.

----------

## Fabiolla

Hallo, 

könnte folgend funktionieren:

```

for file in /mnt/media/Audio/*m3u; do sed -i -e 's/.flac/.ogg/g' $file; done

```

Mit den Parameter -i ersetzt sed direkt in der Datei -> es muss keine temporäre Datei angelegt werden.

Wenn es in /mnt/media/Audio noch Unterorder gibt könnte man auch eine Kombination mit find | xargs anwenden

lg

----------

## Lenz

Ja, in /mnt/media/Audio/ gibt es noch viele Unterordner, Künstler und dann noch jeweilig die Alben.

----------

## Thargor

und den punkt muss man meines wissens nach escapen, da der sonst für ein beliebiges Zeichen steht

(Korrigiert mich, wenn ich falsch liege)

Also

```
for file in /mnt/media/Audio/*m3u; do sed -i -e 's/\.flac/\.ogg/g' $file; done
```

----------

## think4urs11

so sollte das eigentlich gehen:

... gestrichen wg. 'Anforderungen gar nicht bis falsch verstanden'

----------

## Thargor

Würde das nicht alle *.flac in *.ogg verschieben?

 *Lenz wrote:*   

> ... nur steht in den Playlisten noch die Dateiendung der Stücke auf .flac. ...

 

Gefragt war doch, die Dateinamen in den Playlists zu ändern? (Oder kapier ich dein script bloß nich  :Question:   :Very Happy:  )

----------

## think4urs11

öh ja jetzt wo du das so sagst... man sollte eben so früh am morgen noch nicht das Gehirn hochfahren und die Anforderungen dann doch nur halb verstehen.

Hast natürlich recht - hab das schlicht völlig falsch verstanden   :Embarassed: 

so richtig? (in files je .flac durch .ogg tauschen)

```
for i in `find /mnt/media/Audio/ -iname *.m3u | xargs`; do sed -ie 's/\.flac/\.ogg/' $i; done
```

----------

## Lenz

Das geht schon in die richtige Richtung, nur hat das leider noch Probleme mit Leerzeichen in Datei-/Ordnernamen.

----------

## Anarcho

Oh je...warum nicht direkt das richtige Tool nehmen:

```
*  sys-apps/rename

      Latest version available: 1.3

      Latest version installed: 1.3

      Size of downloaded files: 81 kB

      Homepage:    http://rename.berlios.de/

      Description: tool for easily renaming files

      License:     GPL-2
```

Und dann mit dem beiligenden Tool renamexm einfach per Regulären ausdruck die Dateinamen ändern:

```
renamexm '-s/.flac/.ogg/' *
```

mit 

```
renamexm '-s/.flac/.ogg/' * -t
```

kannst du nachschauen ob er auch die richtigen Änderungen machen würde. Falls noch Dateien in Unterverzeichnissen liegen: einfach -R noch hinzufügen.

----------

## Lenz

Weil es nicht um den Dateinamen geht, sondern um den Inhalt der Playlists!

----------

## think4urs11

*g* Anarcho hat genausowenig ausgeschlafen wie ich  :Wink: 

@Lenz: Versuch mal das $i durch "$i" auszutauschen

----------

## Lenz

Das funktioniert leider nicht, wenn ich ein Album habe /Neil Young/Broken Arrow/ kommt das raus:

```
sed: kann Arrow/Neil nicht lesen: Datei oder Verzeichnis nicht gefunden

sed: kann Young nicht lesen: Datei oder Verzeichnis nicht gefunden

sed: kann - nicht lesen: Datei oder Verzeichnis nicht gefunden

sed: kann Broken nicht lesen: Datei oder Verzeichnis nicht gefunden

sed: kann Arrow nicht lesen: Datei oder Verzeichnis nicht gefunden
```

----------

## Anarcho

 *Think4UrS11 wrote:*   

> *g* Anarcho hat genausowenig ausgeschlafen wie ich 
> 
> @Lenz: Versuch mal das $i durch "$i" auszutauschen

 

Shit. Hast recht. 

Dann lass ich euch mal weiter mit sed rumbasteln...  :Wink: 

----------

## think4urs11

nu aber (hoffentlich *g*)

```
for i in "$(find /mnt/media/Audio/ -iname *.m3u)"; do sed -ie 's/\.flac/\.ogg/' "$(echo $i)"; done
```

----------

## Lenz

LOL, wie nähern uns dem Ziel, jetzt hat er alle Dateinamen aneinandergereiht und als einen Dateinamen aufgefasst. Fehlermeldung:

```
Kann <10 Seiten langer Dateiname> nicht lesen: Der Dateiname ist zu lang
```

----------

## think4urs11

 *Lenz wrote:*   

> LOL, wie nähern uns dem Ziel, jetzt hat er alle Dateinamen aneinandergereiht und als einen Dateinamen aufgefasst.

 

*hrmpf* jetzt nehm ichs bald persönlich   :Twisted Evil: 

```
find /mnt/media/Audio/ -name *.m3u -exec sed -i 's/\.flac/\.ogg/' '{}' \;
```

die for-Schleife sollte unnötig sein.

----------

## Lenz

Ah, das hat funktioniert!  :Smile:  Das nenn ich Automatisierung, da hätte ich mit dem Editor ja Tage dran gesessen. Der Befehl kommt sofort in meine Datei "Wichtige UNIX-Befehle". Sed muss ich mir mal genauer anschauen, ich hab noch mehr solche Sachen zu lösen.

----------

## mrsteven

 :Arrow:  http://www.tty1.net/sed-tutorium/html/index.html

----------

## Lenz

Danke!   :Cool: 

----------

## think4urs11

 *Lenz wrote:*   

> Ah, das hat funktioniert!  Das nenn ich Automatisierung, da hätte ich mit dem Editor ja Tage dran gesessen. Der Befehl kommt sofort in meine Datei "Wichtige UNIX-Befehle". Sed muss ich mir mal genauer anschauen, ich hab noch mehr solche Sachen zu lösen.

 

Sed ist vergleichsweise simpel, ich habe da eher so meine Problemchen mit dem richtigen quoten ala '`"$(\ etc. 

und wenn du jetzt noch [solved] an den Titel hängst wär fein  :Smile: 

----------

## Lenz

Okay, und danke für die Bemühungen!

----------

