Zunächst sollte ich sagen, dass der einfachste Weg, dies zu tun, darin besteht, die Befehle vor dem Umbenennen oder Umbenennen zu verwenden.
Unter Ubuntu, OSX (Homebrew-Paket rename
, MacPorts-Paket p5-file-rename
) oder anderen Systemen mit Perl-Umbenennung (Vorname):
rename s/0000/000/ F0000*
oder auf Systemen mit Umbenennung von util-linux-ng wie RHEL:
rename 0000 000 F0000*
Das ist viel verständlicher als der entsprechende sed-Befehl.
Zum Verständnis des Befehls sed ist jedoch die Manpage sed hilfreich. Wenn Sie man sed ausführen und nach & suchen (mit dem Befehl / suchen), finden Sie in s / foo / bar / replace ein Sonderzeichen.
s/regexp/replacement/
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
Entspricht daher \(.\)
dem ersten Zeichen, auf das verwiesen werden kann \1
. Dann .
passt das nächste Zeichen, das ist immer 0. Dann \(.*\)
den Rest des Dateinamens übereinstimmt, die durch Bezug genommen werden kann \2
.
Die Ersetzungszeichenfolge fügt alles unter Verwendung &
(des ursprünglichen Dateinamens) zusammen und \1\2
ist jeder Teil des Dateinamens mit Ausnahme des zweiten Zeichens, das eine 0 war.
Dies ist meiner Meinung nach ein ziemlich kryptischer Weg, dies zu tun. Wenn der Befehl zum Umbenennen aus irgendeinem Grund nicht verfügbar war und Sie sed zum Umbenennen verwenden wollten (oder vielleicht etwas zu Komplexes zum Umbenennen?), Würde eine deutlichere Darstellung in Ihrer Regex die Lesbarkeit erheblich verbessern. Vielleicht so etwas wie:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
In der Lage zu sein, zu sehen, was sich in s / search / replace / tatsächlich ändert, macht es viel lesbarer. Außerdem werden keine Zeichen aus Ihrem Dateinamen herausgesaugt, wenn Sie ihn versehentlich zweimal ausführen oder so.