Ich habe eine Reihe von Dateien:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Ich möchte mit diesem Format umbenennen:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Es muss den _
In-Zeitstempel entfernen und den hinzufügen _TIMING
.
command-line
batch-rename
Jojo Mendoza
quelle
quelle
10.3.100.179
mit10.4.100.135
. Wollen Sie das oder wollen Sie nur das_TIMING
und das_
aus der Zeit entfernen ?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(und "TIMING" könnte dann sogar entfernt werden, da es jetzt eindeutig wie ein Datum und eine Stunde (und Millisekunden) aussieht, insbesondere wenn der Standard weiter verbreitet wird. Das T ist Teil des Standards und ich wuchs es zu mögen (und:
in einem Dateinamen zu verwenden. Ich glaube, Windows unterstützt das nicht.Antworten:
Installieren
renameutils
undqmv
mit Ihrem bevorzugten Texteditor verwenden.qmv
Lädt alle Namen in Ihren Editor und beim Speichern und Schließen werden die Änderungen auf die eigentlichen Dateien angewendet. Wenn die Änderungen inkonsistent sind (z. B. wenn zwei Dateien denselben Namen haben), wird der Vorgang abgebrochen, ohne dass etwas berührt wird. Zirkuläre Umbenennungen werden ebenfalls korrekt behandelt.Normalerweise mache ich:
Damit wird nur eine Spalte mit Namen angezeigt (do: destination-only). So sieht es aus:
Wenn Sie es mit den mehreren Cursorn von SublimeText, Atom oder Visual Studio Code kombinieren, ist es ein sehr nützliches und leistungsstarkes Werkzeug für die Massenumbenennung. Zum Beispiel würden Sie für Atom tun
EDITOR="atom -w" qmv -f do
.quelle
Verwenden Sie
rename
...Mit
-n
diesem Befehl wird ausgegeben, was zu tun ist, ohne Änderungen vorzunehmen:Wenn es richtig aussieht, entfernen Sie die
-n
Erklären ...
s/something/something_else/
Suchen und Ersetzen^
der Beginn des Namens (Verankerung)[0-9]
irgendeine Nummer+
ein oder mehrere der vorhergehenden Zeichen\.
wörtlich.
(ohne dass\
dies einem Zeichen entspricht)()
um diesen Teil zu behalten$1$2$3$3
zurück Verweise auf die Dinge früher abgestimmt und gehalten()
Hinweis:
*
Am Ende des Befehls werden alle sichtbaren Dateien im aktuellen Verzeichnis abgeglichen. Verwenden Sie gegebenenfalls einen geeigneteren Glob.quelle
prename
(p für Perl, da das erste Argument ein Perl-Ausdruck ist)mmv
kann es wie folgt machen:# 1, # 2, # 3, ... verweist hier jeweils auf das passende '*'.
Es ist noch kürzer mit:
quelle
Ein anderer
rename
Ansatz:Wenn das so zu funktionieren scheint, wie Sie es möchten, entfernen Sie die
-n
.quelle
Sie können auch Folgendes verwenden. Erstellen Sie zuerst eine Sicherungskopie Ihrer Dateien und versuchen Sie Folgendes:
sed 's/\(.*\)_\(.*\)_/\1\2/')
löscht die_
Zeichen im Zeitstempel.Beispielsweise:
quelle
find -maxdepth 1 -exec rename ... {} +
die Auflistung des aktuellen Verzeichnisses in der Befehlszeile von Rename stapeln. (Hinzufügen-name *.jpg
oder was auch immer Sie wollen). Das wird viel schneller ausgeführt als eine Shell-Schleife, die forks + execssed
undmv
für jeden Dateinamen ausführt , anstatt nur einen Systemaufruf umzubenennen. (Sie könntensed
Bashs eingebautes Regex-Zeug loswerden , aber das Gabelnmv
ist immer noch langsam.)Sie sind wahrscheinlich fertig, aber hier ist eine (einfache)
bash
Lösung:Ist "simple ... bash solution" ein Oxymoron?
PS: Die Logik in der Schleife wurde mit einem Ihrer Beispieldateinamen getestet. Es ging vorbei.
quelle
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
oder so zu verwenden. (Völlig ungetestet und wahrscheinlich falsch, aber die allgemeine Idee ist, dass Erfassungsgruppen in das BASH_REMATCH-Array aufgenommen werden.)bash
) Capturing-Gruppen verwendet, und um ganz ehrlich zu sein, ist bash nicht die erste Sprache, mit der ich sie ausprobieren würde. (Ich denke, esbash
ist eine hässliche Sprache.) Trotzdem ist es eine gute Lösung und hat mir etwas so Gutes beigebracht.printf -v "$3" ...
die Variable setzt, in der der Name enthalten ist$3
.) zusammen ist ziemlich schwer zu verfolgen / zu debuggen, zumindest habe ich es so gefunden, als ich versucht habe, es aufzuräumen / Fehler zu beheben. Siehe den Code auf GithubWenn Sie GUI verwenden könnten, würde ich pyRenamer empfehlen .
Es ist in den meisten Distributionen vorhanden, zB in Ubuntu:
Es kann alles, was Sie wollen und mehr.
quelle
Hier ist Ihre RAW - built-in
find
+xargs
+sed
+mv
oneliner (Liebe oneliners):Erläuterung:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: liste alle JPEGs im aktuellen Verzeichnis auf und führe dann für jedes einen Shell-Befehl aus (die Sortierung ist natürlich optional, aber halte die Dinge ein wenig sauberer, wenn du dich irgendwo anmeldest)-print0
,-z
,-0
: Es ist gute Gewohnheit zu trennen Elemente mit binären ,0
wenn Dateinamen Zeichenüber Probleme zu vermeiden , die mit in-the-Middle - weiß-Räumen (nicht Ihr Fall though)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (Schrägstriche in demsed
‚s regex nicht helfen , die Lesbarkeit, aber es ist einfach) jede Datei umbenennen , indem Sie die Unterstrich-separeted Folge von 8 + 6 + 4 Stellen mit ihrer zusammenhängenden Verkettung und diese ersetzt_TIMING
Sache (\i
ein Rückreferenzierung zu der isti
- Regex-Gruppe).Refs: Xargs - Mann sed
quelle