ubuntuusers.de

Problem mit find und Leer- / &-Zeichen in Verzeichnisnamen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

tommey

Anmeldungsdatum:
22. März 2017

Beiträge: 1

Hallo, danke für den hilfreichen Artikel: Es gibt aber ein halbes Problem : Der Befehl, wie im Artikel aufgelistet, ist sehr hilfreich, mit dem man in den Unterordnern die Dateien ebenfalls umwandelt:

1
find . -type d -exec sh -c '(cd {} && for i in *.wav; do lame -h -b 128 "$i" "`basename "$i" .wav`".mp3; done)' ';' 

Das Problem deses Befehls liegt darin, dass dies nur für Ordner gilt, die aus Namen in einem Stück stehen,also ohne Leerzeichen zu beinhalten. Diejenigen Ordner, die Leerzeichen im Namen haben, werden ignoriert, Terminal gibt z.B. das aus:

System error.
Could not open sound file "*.wav".
sh: 1: cd: can't cd to ./Büchner
sh: 1: Majakowskij: not found
sh: 1: cd: can't cd to ./Shakespeare
sh: 1: cd: can't cd to ./Goethe
sh: 1: Villon: not found
sh: 1: cd: can't cd to ./Wiedersehen

Wobei die jeweiligen Ordner "Büchner & Majakowski", "Shakespeare Hamlet" und "Goethe & Villon" hießen. Scheinbar macht das System nach diesem Befehl "cd" zu "Büchner", und schneidet "& Majakowski" ab, bzw. " Hamlet"; und kann in diesen Ordner nicht wechseln.

Wie kann man den Befehl ergänzen, damit auch andere ahnungslose Leser nicht auf diese Fehlerausgabe treffen? Bzw. wo kann man es lernen, solch einen Befehl zu kreieren, leider ist auf der Wiki-Seite von "find" nicht so viel zu finden... Vielen Dank.

Moderiert von noisefloor:

Abgetrennt vom Wikiartikel zu LAME, weil Supportanfrage. Neu gewonnenes Wissen darf aber gerne ins Wiki zurück fließen ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

Herzlich willkommen hier im Forum!

tommey schrieb:

Hallo, danke für den hilfreichen Artikel: Es gibt aber ein halbes Problem : Der Befehl, wie im Artikel aufgelistet, ist sehr hilfreich, mit dem man in den Unterordnern die Dateien ebenfalls umwandelt:

1
find . -type d -exec sh -c '(cd {} && for i in *.wav; do lame -h -b 128 "$i" "`basename "$i" .wav`".mp3; done)' ';' 

Wenn ich das richtig sehe, sollen einfach alle .wav-Dateien nach .mp3 umgewandelt werden. Die .mp3 sollen neben den .wavs, also im selben Verzeichnis liegen. Das Problem ist das Quoting, wenn man {} benutzt. In schneller Fix wäre (ungetestet):

1
find . -type d -exec sh -c '(cd "{}" && for i in *.wav; do lame -h -b 128 "$i" "`basename "$i" .wav`".mp3; done)' ';' 

Der Fix hat aber immer noch Probleme, wenn Sonderzeichen (wie z.B. doppelte Anführungsstriche) in Verzeichnisnamen vorkommen. Ich würde das so machen:

1
find -type f -iname '*.wav' -exec sh -c 'for i; do lame -h -b 128 "$i" "${i%.*}.mp3"; done' -- {} +

Wie kann man den Befehl ergänzen, damit auch andere ahnungslose Leser nicht auf diese Fehlerausgabe treffen?

s.o.

Bzw. wo kann man es lernen, solch einen Befehl zu kreieren, leider ist auf der Wiki-Seite von "find" nicht so viel zu finden...

So etwas kommt hier im Forum recht häufig vor... ☺ Wir haben auch den Shell/Bash-Skripting-Guide für Anfänger.

Antworten |