Beim Lesen von Tutorials zum Batch-Umbenennen von Dateien in Bash und beim Verwenden des sort
Befehls zum Sortieren von Dateiinhalten konnte ich nicht herausfinden, wie beide kombiniert werden können.
Ich habe ein Verzeichnis, dessen Inhalt nach Tags im Dateinamen sortiert ist, ähnlich wie das Programm TagSpaces die Dinge handhabt. Ich füge alle denkbaren Tags am Ende des Dateinamens hinzu, wenn ich sie erstelle oder herunterlade. Hier ist ein Beispiel:
Sunrise (2) #wallpaper #4k #googleimages.jpg
Jetzt möchte ich alle diese Dateien durchgehen und sie umbenennen, damit die Tags alphabetisch sortiert sind, ohne dass dies Auswirkungen auf die Tags vor oder nach den Tags hat (z. B. den Titel oder die Dateierweiterung eines Bildes). So würde das Obige werden:
Sunrise (2) #4k #googleimages #wallpaper.jpg
Wie schaffe ich das? Ich kann nicht einmal herausfinden, wie ich den Namen einer Datei und nicht ihren Inhalt an einen Befehl wie übergeben soll sort
, zu dessen Ausgabe ich dann vielleicht weiterleiten könnte mv
.
Antworten:
Testen:
quelle
Wenn Sie Perl-basiert haben
rename
(prename
auf einigen Systemen), können Sie die Tags mit Perl teilen und sortieren. Zum Beispiel gegebendann (mit einigen hässlichen Auseinandersetzungen, um das
.jpg
Suffix zu entfernen und zu ersetzen )Überprüfung
Wahrscheinlich viel Raum für Verbesserungen - aber ich hoffe, es gibt Ihnen eine Idee.
quelle
Mit
zsh
:(Entfernen Sie den
-n
(Trockenlauf), wenn Sie zufrieden sind).[^#]#
: 0 oder mehr Nicht-# -Zeichen (#
wie*
in regulären Ausdrücken)s: :
auf Raum teileno
: order (sort)j: :
: mit dem Raum verbinden.Also teilen wir den Teil zwischen dem ersten
#
(eingeschlossen) und dem letzten.
(ausgeschlossen) im Raum auf und sortieren die resultierende Liste, die wir mit dem Raum verbinden.Rekursiv:
Um Leerzeichen in Tag-Namen zuzulassen, können wir
#
nachfolgende Leerzeichen aufteilen und kürzen, sortieren und verbinden#
mit:Fügen Sie ein
(#qD)
Glob-Qualifikationsmerkmal hinzu, wenn Sie auch versteckte Dateien (D
ot-Dateien) oder Dateien in versteckten Verzeichnissen verarbeiten möchten.quelle
Gute Frage!
Hier ist mein einfaches
bash
Skript dafür:Erläuterung:
In
afile=( ${file#*)} );
: Wir konvertieren den String in ein Array. In diesem Zustand führt die Shell eine Wortteilung mit Leerzeichen durch, es sei denn, Sie zitieren die Zeichenfolge.In
${file#*)}
( Cut-up-to-First-Präfix ): Wir entfernen alles vom Anfang der Zeichenfolge bis zur ersten)
Verwendung,shell parameter expansion
da dies unter#wallpaper #4k #googleimages.jpg
Berücksichtigung derfile="Sunrise (2) #wallpaper #4k #googleimages.jpg"
In
${file%%#*}
( Cut-up-to-Last-Suffix ); Abisolierstart vom Ende bis zum Betteln der Saite bis zuletzt#
gesehen. dies wird resultierenSunrise (2)
In
${afile[@]%%.*}
( Cut-up-to-Last-Suffix ): Wie oben, beginnt das Strippen vom Ende bis zum Betteln des Strings (hier in jedem indizierten Array) bis zum letzten.
Mal. Dies wird dazu führen#wallpaper #4k #googleimages
, wir könnten auch${afile[@]%.*}
besser gebrauchen !In
printf "%s\n" "${afile[@]%%.*}"
: Wir drucken die Array-Elemente mit Zeilenumbrüchen ([@]
wird für indizierte Arrays verwendet) (warum mit Zeilenumbrüchen? Weil wir sie sortieren und die Elemente in Zeilenumbrüche aufteilen sollten).In
$(sort<(printf "%s\n" "${afile[@]%%.*}"))
: Wir sortieren die Elemente (oder Tags).In
$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}")))
: wie oben, aber wir haben einen zusätzlichenecho
Befehl verwendet, um die sortierten Elemente in einer linearen zu sammeln.möglich gleich auch bei Verwendung von double
xargs
like... |xargs -n1| sort | xargs
.Bitte sehen Sie das folgende Beispiel, um diesen Schritt besser zu verstehen:
Schließlich wird am Ende der
mv
Befehl den$file
in den geänderten Namen umbenannten Namen umbenennen .Ps: vor dem entfernen,
echo mv ...
um denmv
Trockenlauf zu beenden und das eigentliche Umbenennen durchzuführen.quelle
Dies scheint ein bisschen zu kompliziert für Bash, um ehrlich zu sein. Es ist nicht unmöglich, aber meiner Meinung nach ist es weitaus besser, eine Sprache zu verwenden, die für "echte" Programmierung gemacht ist. Eine Bash-Lösung ist wahrscheinlich nicht zu verwalten. (Ich versuche nicht, die Nur-Bash-Lösung zu beleidigen, aber ich finde die Umbenennungsmagie eigentlich ziemlich erstaunlich.)
Das heißt, hier ist eine Lösung mit Ruby. Sie können es in eine Datei schreiben und die Datei dann einfach aus Ihrer Shell heraus ausführen, vorausgesetzt, Sie haben Ruby installiert.
Um das Skript auszuführen, platzieren Sie es einfach in dem Verzeichnis, in dem sich Ihre Bilder befinden. Diese Lösung sollte ziemlich widerstandsfähig gegenüber albernen Bildnamen und Tags sein,
C#
die keine Probleme verursachen. Stellen Sie jedoch sicher, dass Sie ein Backup erstellen, bevor Sie das Skript ausführen. Bewegungsoperationen können genauso zerstörerisch sein wierm
.quelle