2013-01-09 16 views
6

Ich schreibe ein Bash-Skript zum Aufräumen in meiner Musik.Linux Umbenennen Befehl Großbuchstaben ersten Buchstaben

wollte ich es alle Dateinamen zu formatieren und sie zu machen und so mit einer kleinen Internet-Suche habe ich diese Zeile:

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g" 

Was ich verwenden, um die Dateinamen in eine Textdatei hinzufügen und dann sed es, aber dann wusste ich nicht, wie man die neuen Namen auf die Dateien anwendet.

Also fing ich an zu experimentieren mit dem Umbenennen und schaffte es, genau das gleiche Ergebnis zu bekommen, mit Ausnahme der fettgedruckten Teile, was jeden ersten Buchstaben in einem Wort Großbuchstaben ergeben soll.

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" * 

Nun wird der Code in Umbenennungs arbeitet (zufriedenstellend zumindest), nur einen Buchstaben nach dem ein Leerzeichen zu finden, aber es ist der Ersatz, die problematisch ist. Ich habe viele verschiedene Ansätze ausprobiert, die mich dazu veranlasst haben, dass der erste Buchstabe im Fokus in diesem Fall genau auf A-Z getauscht wird.

In der Umbenennung Handbuchseite heißt es, Kleinbuchstaben Großbuchstaben machen Sie 's/a-z/A-Z/g', aber es ist einfach zu erkennen, dass es nur gilt, wenn es a-z A-Z findet. Also das ist, was ich brauche mit Hilfe. Ein Bonus wäre, wenn jemand weiß, wie man es im sed-Beispiel macht, wo der \ < den Anfang jedes Wortes anpasst, weil im Moment mein Umbenennungsbefehl nicht auf das allererste Wort angewendet wird es gilt auch nicht, wenn mehrere Discs aus offensichtlichen Gründen wie "Disc-Name [Disc 1]" aussehen.

+0

Ich bemerke, dass Sie auf Ihren Posts "abmelden". [Tun Sie das nicht.] (Http://stackoverflow.com/faq#signatures) – chrisaycock

+0

Wenn Sie bereits eine Textdatei mit Quellnamen und Zielnamenpaaren haben, ist 'sed 's/^/mv /' textfile | sh 'ist alles was du brauchst (obwohl das Zitieren von Dateinamen mit Leerzeichen etc. die Dinge kompliziert, das ist nur ein Beweis des Konzepts, keine wirkliche Antwort). – tripleee

Antwort

3

Dies sieht für den Anfang der Zeichenfolge \A oder Leerzeichen \s mindestens ein oder mehr Wortzeichen, gefolgt von (a-z, 0-9, unterstreichen) \w+. Es wird das erste Zeichen aller Wortsequenzen großgeschrieben.

7

Dies ist eine Art Perl-Frage, da rename in Perl geschrieben wird, und Anweisungen zum Ausführen der Umbenennung sind ein Perl-Befehl.

In einer s/// für die Substitution zu wissen, welcher Buchstabe, um die Großbuchstabe Version von einfügen, muss es den Brief von der Eingabe "erfassen". Klammern im Muster machen dies und speichern den erfassten Buchstaben in der Variablen $1. Und \u in einer Substitution macht das nächste Zeichen Großbuchstabe.

So können Sie tun:

$ rename 's/\s(\w)/ \u$1/g' * 

Beachten Sie, dass das Ersatzteil ein Leerzeichen vor dem Großbuchstaben einfügen muss, weil das Muster einen Raum umfasst und beide so der Raum und das Original des Briefes werden ersetzt. Sie können dies vermeiden, indem \b verwenden, eine Breite von Null Behauptung, die nur an einer Wortgrenze übereinstimmt:

$ rename 's/\b(\w)/\u$1/g' * 

Sie brauchen auch nicht die {1} dort, weil \w (wie auch andere Symbole in regexs) passt ein ein einzelnes Zeichen standardmäßig.

schließlich das Beispiel in Umbenennungs (1) ist eigentlichy/A-Z/a-z/, unter Verwendung des y/// Operator, nicht s///. y/// ist ein völlig anderer Operator, der alle Vorkommen eines Satzes von Buchstaben durch einen anderen ersetzt; Das ist für dich hier nicht von Vorteil, wenn nur ein paar Zeichen groß geschrieben werden sollen.

+0

Danke für diese gründliche Erklärung. Es hat mir enorm geholfen, mein Ziel zu erreichen. Ich habe meine ganze Substitutionsformel neu formatiert und bin mit umbenennen '/ (\ w) (\ w {1,})/\ u $ 1 $ 2/g' * gelandet, das nach einem Buchstaben sucht und es in $ 1, IF und nur einfängt Wenn auf diesen Buchstaben mindestens ein weiterer Buchstabe folgt, wird 1 $ groß geschrieben und der Rest des Wortes mit $ 2 ausgegeben. Ich hatte einige Probleme damit, dies herauszufinden, mit der \ b-Grenze und lies, dass es nicht zwei alphabetische Zeichen nach einander abgleichen würde, aber \ B tat, obwohl das auch nicht funktionierte ... Ich bin mir nicht sicher warum genau An diesem Punkt. – Jompa

+0

"1 oder mehr" ist eine allgemeine Anforderung, so hat sein eigenes Symbol, "+". Sie können '\ w +' anstelle von '\ w {1,}' schreiben. – Smylers

+0

'\ b' passt zum Übergang von einem Wortzeichen zu einem Nichtwortzeichen (oder umgekehrt). '\ B' ist das Gegenteil und passt irgendwo anders. So passt '/ \ b \ w \ B /' einem Wortzeichen, das kein Wortzeichen davor haben darf, aber ein Wortzeichen dahinter hat. Das bedeutet, dass 's/\ b (\ w) \ B/\ u $ 1/g' den gleichen Effekt wie deine Formel hat, aber nicht die zweiten und nachfolgenden Zeichen von Wörtern herausnimmt, nur um sie wieder einzufügen. – Smylers

Verwandte Themen