Ich kann den folgenden Befehl erfolgreich verwenden und bin mit diesem Befehl ziemlich sicher, andere Kombinationen zu erstellen:
rename 's/\.htm/\.html/' *.htm
Ich möchte jedoch mehr darüber wissen, insbesondere darüber s
. Sie sagen, es sei ein Perl-Ausdruck. Ich habe keine Perl-Programmiersprache gelernt, daher habe ich keine Ahnung, warum es so ein 's/\.htm/\.html/'
Argument gibt. Würdest du mir sagen, was es ist? Danke fürs Lesen.
Antworten:
Im Allgemeinen werden
rename
die Dateinamen gemäß der als erstes Argument des Befehls angegebenen Regel umbenannt. Die Dateinamen werden von den Argumenten geliefert, die auf das erste folgen.Das erste Argument im Beispielbefehl (
rename 's/\.htm/\.html/' *.htm
) enthält Pelzteile, wobei in diesem Fall/
ein Trennzeichen für diese Teile ist:Der
s
Befehl bedeutet Ersatz :s/<old>/<new>/
. Passen Sie den regulären Ausdruck an den Inhalt des Musterbereichs an. Wenn gefunden, ersetzen Sie die übereinstimmende Zeichenfolge durch Ersetzen.Regulärer Ausdruck, der mit den Zeichenfolgen übereinstimmt, die ersetzt werden sollen. Im aktuellen Fall ist dies nur die Zeichenfolge
.htm
.In den meisten regulären Ausdrücken
.
stimmt der Punkt mit jedem Zeichen überein. In diesem Fall möchten wir den Punkt wörtlich verwenden, daher müssen wir seiner speziellen Bedeutung durch Verwendung des Schrägstrichs\
(unter Angabe eines einzelnen Zeichens) entgehen .Ersatz des Stichs / Regexp auf 2 abgestimmt.
Flag, das im aktuellen Beispiel nicht dargestellt wird. Es könnte zum Beispiel das Flag sein
g
- wenden Sie den Ersatz auf alle Übereinstimmungen auf den regulären Ausdruck an, nicht nur auf den ersten. Nehmen wir an, wir haben eine Datei mit dem Namenmy.htm-file.htm
:Der ursprüngliche Befehl
rename 's/\.htm/\.html/' *.htm
benennt die Datei folgendermaßen um : . Schauen Sie sich am Ende der Antwort an, wie Sie dieses Problem vermeiden können.my.html-file.htm
Durch Hinzufügen des
g
Flags -rename 's/\.htm/\.html/g' *.htm
- lautet der neue Dateiname : .my.html-file.html
Entsprechend den Dateinamen:
*
kann eine beliebige Anzahl von Zeichen darstellen (einschließlich null, dh null oder mehr Zeichen). Die Shell erweitert diesen Glob und übergibt die übereinstimmenden Dateinamen als separate Argumente anrename
So*.htm
- stimmt mit allen Dateinamen im aktuellen Pfad überein, die mit der Zeichenfolge enden.htm
. Wenn Sie zum Beispiel haben1.htm
,2.htm
,3.htm
,4.htm
, und5.htm
dannrename 's/\.htm/\.html/' *.htm
passiert genau die gleichen Argumente wie ausgeführt umbenennen:Der gesamte Befehl (
rename 's/\.htm/\.html/' *.htm
) könnte folgendermaßen gelesen werden:Kehren wir zum Beispiel zurück, wenn wir eine Datei mit dem Namen haben
my.htm-file.htm
. Wahrscheinlich möchten wir den letzten Teil des Dateinamens, die sogenannte Erweiterung, nach dem letzten Punkt ändern. Zu diesem Zweck sollten wir denrename
Befehl folgendermaßen ändern :Wo das
$
Zeichen mit dem Ende der Zeile übereinstimmt und wörtlich "rückwärts lesen" bedeutet.Verweise:
quelle
rename
sieht nie*.htm
. Bevor es ausgeführt wirdrename
, erweitert die Shell diesen Glob und übergibt die übereinstimmenden Dateinamen als separate Argumente anrename
. Wenn Sie1.htm
,2.htm
,3.htm
,4.htm
, und5.htm
dannrename 's/\.htm/\.html/' *.htm
passiert genau die gleichen Argumenterename
wie ausgeführtrename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
. Sind Sie bereit, diese zu bearbeiten oder zu akzeptieren, um dies zu korrigieren? Diese Antwort ist ansonsten gut.