Erläuterung des Befehls zum Großbuchstaben des ersten Buchstabens eines Dateinamens

7

Ich versuche zu lernen, Dateien mit der Befehlszeile umzubenennen, und nachdem ich viele Seiten durchsucht habe, habe ich endlich einen Befehl gefunden, der den ersten Buchstaben einer Datei in Großbuchstaben schreibt, aber das Problem ist, dass ich die Bedeutung jedes Befehls verstehen möchte . Der Befehl lautet:

for i in *; do new=`echo "$i" | sed -e 's/^./\U&/'`; mv "$i" "$new";done

Ich verstehe das 'für' irgendwie ... aber nicht das 'Echo' oder '' 'und besonders den sed Befehl. Wenn jemand ein wenig Geduld hat, um die Bedeutung jeder Sache zu erklären, wäre das großartig! Vielen Dank!

user21294
quelle

Antworten:

16
for i in *; 
    do new=`echo "$i" | sed -e 's/^./\U&/'`;
    mv "$i" "$new";
done;

Wäre der gesamte Code aufgeschlüsselt, um ihn leicht sichtbar zu machen, werde ich unten erklären.


Zuerst müssen wir sicherstellen, dass wir jede Datei verarbeiten. Die folgende Zeile bedeutet: "Gehen Sie wie folgt vor, solange Sie Dateien finden können."

for i in *;

Dann müssen wir den aktuellen Dateinamen laden (der in der Variablen $ i gespeichert ist), den ersten Buchstaben durch eine großgeschriebene Version ersetzen und den neuen Namen (in der Variablen $ new) speichern.

Der folgende Befehl bedeutet im Wesentlichen: Variable $ new ( do new=) erstellen Laden Sie $ i und leiten Sie es ( "$i" |) an eine Funktion weiter, die den ersten Buchstaben durch einen großgeschriebenen ersetzt. ( sed -e 's/^./\U&/'; `)

Die sed Handbuchseite finden Sie hier . Es wird verwendet, um grundlegende Texttransformationen durchzuführen. Grundsätzlich wird ein regulärer Ausdruck (der 's/^./\U&/'Teil) (eine Methode zum Erkennen eines bestimmten Musters in einem Text) verwendet, um nicht kapitalisierte Erstzeichen zu erkennen und durch eine großgeschriebene Version zu ersetzen.

do new=echo "$i" | sed -e 's/^./\U&/';

Nachdem wir den neuen Namen erhalten haben, ist es Zeit, die Datei mit dem neuen großgeschriebenen Namen umzubenennen. Der folgende Befehl führt dies aus.

Es heißt: Verschiebe (wie beim Umbenennen) die alte Datei foo.bar in die neue Foo.bar.

mv "$i" "$new";

Wir haben jetzt eine Datei umbenannt und es ist Zeit, zur nächsten zu wechseln. Das Folgende schließt die for-Funktion ab und teilt ihr mit, dass es jetzt Zeit ist, fortzufahren und die nächste Datei zu verarbeiten.

done;
Stapelüberlauf ist tot
quelle
4
Schöne Erklärung. Es ist erwähnenswert, dass das \ U in sedGroßbuchstaben des Ersatzes eine GNU- sedErweiterung ist und auf UNIX-Systemen, auf denen ein anderes sedverwendet wird, wahrscheinlich nicht funktioniert .
Coneslayer
Dieser Befehl fügt vor jeden Dateinamen einen Buchstaben U ein. Was unerwünscht ist
wütend Kiwi
6

Hier sind einige andere Techniken, falls Sie seddiese nicht unterstützen \U:

for i in *; do first=$(echo "${i:0:1}" | tr '[:lower:]' '[:upper:]'); new=$first${i:1}; mv "$i" "$new"; done

Wenn Sie Bash 4 haben:

for i in *; do mv "$i" "${i^}"; done
Bis auf weiteres angehalten.
quelle
4

Willkommen bei Bash, wo fast alles möglich ist, wenn nicht sofort offensichtlich.

Die Erklärung von BloodPhilia ist sehr gut für Ihre spezielle Anfrage. Wenn Sie interessiert sind, finden Sie hier einige zusätzliche Webressourcen, um mehr zu erfahren:

Bash:

Sed (das ist der 'S'tream'-ED'itor):

Drawk
quelle
Nun, es fügt meiner Antwort etwas hinzu und bezieht sich sogar darauf;) Einige Leute machen es sich zur Gewohnheit, es zu kopieren, ohne etwas hinzuzufügen ... Ihr fügt tatsächlich etwas zu meinem hinzu ... Ich mag das =)
Stapelüberlauf ist tot
1

Um jedes erste Zeichen im Dateinamen mit BASH groß zu schreiben, können Sie ein folgendes Konstrukt verwenden: file_words=( $file ) echo "${file_words[@]^}"

Es ist viel klarer als sed und Sie verwenden nur BASH, also ist es schneller.

Łukasz Rajchel
quelle
-1

Und wenn Sie zsh haben:

for i in *; do mv $i ${(C)i}; done
Henno
quelle
Dieses Großschreibungsflag aktiviert das erste Zeichen aller maximalen alphanumerischen Teilsequenzen, nicht nur das erste Zeichen ( foo=bar.baz && echo ${(C)foo}gibt Bar.Baz). Versuchen Sie es ${(C)i[1]}${i[2,-1]}.
Chris Johnsen
Schade, das ist weniger elegant ... Danke aber.
Henno
Netter Regex, wenn Sie zmv haben, ist es einfacher: zmv '(*)' '$ {(C) 1 [1]} $ {1 [2, -1]}'
Andy D