Zielsetzung
Ändern Sie diese Dateinamen:
- F00001-0708-RG-Biasliuyda
- F00001-0708-CS-akgdlaul
- F00001-0708-VF-hioulgigl
zu diesen Dateinamen:
- F0001-0708-RG-Biasliuyda
- F0001-0708-CS-akgdlaul
- F0001-0708-VF-hioulgigl
Shell-Code
Zu testen:
ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/'
Aufführen:
ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh
Meine Frage
Ich verstehe den sed-Code nicht. Ich verstehe, was der Substitutionsbefehl ist
$ sed 's/something/mv'
meint. Und ich verstehe reguläre Ausdrücke etwas. Aber ich verstehe nicht, was hier passiert:
\(.\).\(.*\)
oder hier:
& \1\2/
Ersteres sieht für mich einfach so aus: "Ein einzelnes Zeichen, gefolgt von einem einzelnen Zeichen, gefolgt von einer beliebigen Längenfolge eines einzelnen Zeichens" - aber es steckt sicherlich noch mehr dahinter. Soweit letzterer Teil:
& \1\2/
Ich habe keine Ahnung.
bash
shell
sed
file-rename
Daniel Underwood
quelle
quelle
Antworten:
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-Paketp5-file-rename
) oder anderen Systemen mit Perl-Umbenennung (Vorname):oder auf Systemen mit Umbenennung von util-linux-ng wie RHEL:
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.
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:
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.
quelle
rename
es sich um einen "umbenannten" Link handelt. dhrename
wurde "umbenannt" vonprename
.. zB in Ubuntu:readlink -f $(which rename)
Ausgaben/usr/bin/prename
... Dasrename
von David erwähnte ist ein völlig anderes Programm.sh
? Dies ist möglicherweise gefährlich, da beliebiger Code ausgeführt werden kann (Sie behandeln Daten als Code).Sie haben Ihre sed-Erklärung erhalten, jetzt können Sie nur die Shell verwenden, ohne externe Befehle zu benötigen
quelle
Ich habe vor ein
sed
paar Jahren einen kleinen Beitrag mit Beispielen zum Batch-Umbenennen geschrieben:http://www.guyrutenberg.com/2009/01/12/batch-renaming-using-sed/
Beispielsweise:
Wenn die Regex - Gruppen enthält (zB
\(subregex\
) , dann können Sie sie im Ersetzungstext als verwenden\1\
,\2
usw.quelle
Der einfachste Weg wäre:
oder tragbar
Dies ersetzt das
F00001
Präfix in den Dateinamen durchF0001
. Credits für Mahesh hier: http://www.debian-administration.org/articles/150quelle
mv "$i" "${i/F00001/F0001}"
. Aber +1Der
sed
BefehlMittel zu ersetzen:
mit:
genau wie ein normaler
sed
Befehl. Die Klammern&
und\n
Markierungen ändern dies jedoch ein wenig.Die Suchzeichenfolge stimmt mit dem einzelnen Zeichen am Anfang überein (und merkt sich dies als Muster 1), gefolgt von einem einzelnen Zeichen, gefolgt vom Rest der Zeichenfolge (als Muster 2 gespeichert).
In der Ersatzzeichenfolge können Sie auf diese übereinstimmenden Muster verweisen, um sie als Teil der Ersetzung zu verwenden. Sie können sich auch auf den gesamten übereinstimmenden Teil als beziehen
&
.Mit diesem
sed
Befehl wird also einmv
Befehl erstellt, der auf der Originaldatei (für die Quelle) und den Zeichen 1 und 3 basiert und Zeichen 2 (für das Ziel) effektiv entfernt. Sie erhalten eine Reihe von Linien im folgenden Format:und so weiter.
quelle
ls | sed "s/\(.\).\(.*\)/mv & \1\2/" | bash
ls
, durchzuleitensed
und dann durchzuleiten ! Es unterliegt einer willkürlichen Codeausführung mit gefälschten Dateinamen. Das Problem ist, dass Daten als Daten behandelt werden sollten. Hier werden sie normalerweise ohne Vorsichtsmaßnahmen in Code serialisiert. Ich wünschte, paxdiablo könnte diese Antwort löschen, da sie wirklich keine gute Praxis zeigt. (Ich bin über diese Frage gestolpert, weil ein Anfänger zufällig| sh
nach einem Befehl, der nicht funktioniert hat, und nachdem er diese Frage und die Antworten gesehen hatte, dachte, dass es besser funktionieren würde - ich bin entsetzt!):)
.Das Backslash-Paren-Zeug bedeutet: "Halten Sie sich beim Anpassen des Musters an das Zeug, das hier passt." Später können Sie auf der Seite des Ersatztextes diese gespeicherten Fragmente mit "\ 1" (erster Block in Klammern), "\ 2" (zweiter Block) usw. zurückerhalten.
quelle
Wenn Sie nur das zweite Zeichen entfernen, unabhängig davon, um was es sich handelt, können Sie Folgendes tun:
aber dein Befehl baut a
mv
Befehl und ihn zur Ausführung an die Shell weiter.Dies ist nicht lesbarer als Ihre Version:
Das vierte Zeichen wird entfernt, da
find
jedem Dateinamen "./" vorangestellt wird.quelle
| sh
nach einem Befehl weiter, der nicht funktioniert, in der Hoffnung, dass es funktioniert besser. Es ist schrecklich! (und außerdem ist das keine gute Praxis). Ich hoffe du wirst verstehen!Die Klammern erfassen bestimmte Zeichenfolgen, die von den rückwärts gestrichenen Zahlen verwendet werden.
quelle
quelle
Folgendes würde ich tun:
Wenn das dann in Ordnung aussieht, fügen Sie
| sh
es am Ende hinzu. So:quelle
Verwenden der Perl-Umbenennung (ein Muss in der Toolbox):
Entfernen Sie den
-n
Schalter, wenn die Ausgabe gut aussieht, um sie wirklich umzubenennen.Es gibt andere Tools mit demselben Namen, die dies möglicherweise können oder nicht. Seien Sie also vorsichtig.
Der Umbenennungsbefehl, der Teil des
util-linux
Pakets ist, wird dies nicht tun.Wenn Sie den folgenden Befehl ausführen (
GNU
)und du siehst
perlexpr
, dann scheint dies das richtige Werkzeug zu sein.Wenn nicht, um es zum Standard (normalerweise bereits der Fall) zu machen
Debian
und abzuleiten wieUbuntu
:Für Archlinux:
Für Distributionen der RedHat-Familie:
Das Paket 'prename' befindet sich im EPEL- Repository.
Für Gentoo:
Für * BSD:
oder
p5-File-Rename
Für Mac-Benutzer:
Wenn Sie diesen Befehl nicht mit einer anderen Distribution haben, durchsuchen Sie Ihren Paketmanager, um ihn zu installieren, oder führen Sie ihn manuell aus :
Die alte Standalone-Version finden Sie hier
Mann umbenennen
Dieses Tool wurde ursprünglich von Larry Wall, dem Vater des Perl, geschrieben.
quelle
quelle