michaelsf
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
Einen wunderschönen guten Tag, für mich ist die Sortierung in Thunar 1.6.3 (Xubuntu 13.10) bezüglich Dateinamen mit Ziffern leider sehr unpraktisch. Ich bräuchte diese so, dass 123.jpg vor 21.jpg angezeigt wird, d.h. dass das erste Zeichen für die Sortierung zählt und es nicht als eine komplette Zahl betrachtet wird. Konkret habe ich mehrere tausend Bilddateien, die aus verschiedenen Kameras stammen und so unterschiedliche Dateinamen tragen. Allerdings habe ich darauf geachtet, dass sie alle mit dem Datum anfangen, nur der Schluss ist unterschiedlich. So gibt es
20131221002.jpg genauso wie 201312201721.jpg und 20131220172059.jpg und 20131219-Adventstreffen.jpg, die ich gerne alphabetisch bzw. Zeichen betrachtend sortiert hätte, also z.B.: 20131218001.jpg 20131219-Adventstreffen.jpg 20131220172059.jpg 201312201721.jpg 20131221002.jpg Lässt sich dieses Verhalten in Thunar ändern (z.B. als Einstellungsoption in einer neuen Version wäre das ideal, aber auch selbst neu kompilieren wäre zur Not eine Option) oder - wenn das zu schwierig ist -
kennt sich jemand mit Regular-Expressions so gut aus, dass er mir eine Befehlszeile geben kann, die alle Dateien, die vorne Zahlen enthalten aber mit weniger als 14 Stellen, diese vor dem folgenden Text(bzw. NichtZahl;-) ) mit 0en auffüllt, also das das Ergebnis dann so aussieht: 20131218001000.jpg 20131219000000-Adventstreffen.jpg 20131220172059.jpg 20131220172100.jpg 20131221002000.jpg Euer Xubuntu Anfänger,
Michael P.S. Nein, ich möchte nicht zu einem anderen Filemanager wechseln. 😉
|
Maxentius
Anmeldungsdatum: 20. November 2013
Beiträge: 170
|
michaelsf schrieb:
Konkret habe ich mehrere tausend Bilddateien, die aus verschiedenen Kameras stammen und so unterschiedliche Dateinamen tragen.
Ich verwende zur Vereinheitlichung der Dateinamen von Fotos, die aus verschiedenen Kameras stammen exiftool: http://wiki.ubuntuusers.de/ExifTool, genauer gesagt, pyExifToolGui als grafisches frontend. Dabei achte ich darauf, dass durchgängig das selbe Schema bei der Namensgebung eingehalten wird; zusätzlich kann auch noch ein erläuterndes Suffix festgelegt werden. Das sieht dann z.B. so aus: 2013-12-27-13-40-59_Rom-01.jpg. Auf diese Weise lassen sich leicht nachträglich sämtliche Dateinamen innerhalb eines Ordners ändern, um Ordnung zu schaffen.
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
Maxentius schrieb: Auf diese Weise lassen sich leicht nachträglich sämtliche Dateinamen innerhalb eines Ordners ändern, um Ordnung zu schaffen.
Gute Idee, leider in meinem Fall nutzlos, da nicht alle Kameras Exif geschrieben haben und auch die dazwischenliegenden Videos keine Exif-Daten haben.
(Abgesehen davon, dass ich das gleiche Prinzip bei Textdateien angewendet habe, die mir nun das gleiche Problem machen.) ☹ Trotzdem vielen Dank für die schnelle Antwort! michael
|
freebirth_one
Anmeldungsdatum: 19. Juli 2007
Beiträge: 5051
Wohnort: Mönchengladbach
|
Hier Ein Script, welcher für deine zwecke brauchbar sein sollte. Erläuterungen sind in diesem Enthalten. Falls du nur den Bash-Einzeiler haben willst, einfach die eigentliche Funktion herauskopieren und in einer Shell ausführen. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | $ cat rename.sh
#!/bin/bash
# Jede Datei im lokalen Verzeichnis wird bearbeitet
## bash-Script für das Padding von Integers am Anfang eines Dateinamens
## Besonders gut zu gebrauchen bei der Anpassung von Dateinamen Verschiedener
## Digitalkameras, so dass diese richtig sortiert werden innerhalb eines
## Dateimanagers
## Funktion
### - Jeder Dateiname wird eingelesen und an sed übergeben
### - Diese erstellt zuerst ein Label "loop" wohin es immer wieder hin zurückspringen kann
### - Dann startet das Matching. Die RE ist wie folgt:
###### - Beginn der Zeile
###### - 1 bis 13 einzelne Zahlen hintereinander (nicht mehr, nicht weniger)
###### - das Ergebnis kommt in einen Block fürs backreferencing (runde Klammern)
###### - mindestens ein Zeichen, dass keine Zahl ist (also Punkte, buchstaben, was auch immer) und danach irgendwelche oder keine zeichen
###### - Das ergebnis kommt auch in zwei Runde Klammern
###### - Zu guter letzt: Ende der Zeile
### - Die Ersetzung ist wie folgt:
###### - nehme das Ergebnis aus dem ersten Block, setze dort ein Null hinter, nehme das Ergebnis aus dem zweiten Block
### - danach wird so oft wieder am Anfang angefangen, wie der Ausdruck etwas findet und ersetzt. ansonsten Ergebnis zurückgeben
#
#
## Erläuterung
### - Der einame wird in zwei teile getrennt: der erste, welcher nur aus maximal sieben Zahlen besehen darf,
### und der Zweite, welche alles andere enthält, aber auf keinen Fall verändert wird.
### - Sollte das erste Muster Treffen (also zwischen 1 und sieben zahlen am Anfang stehen), so wird dem Ergebnis
### eine Null sowie der Reste des Dateinamens angehängt und der Abfrage mit dem Ergebnis nochmal begonnen
### - Sollten so viele Nullen angehängt worden sein, dass es vierzehn Ziffern sind, oder aber schon vorher so viele Ziffern gewesen
### sein, so trifft das erste Muster nichts mehr, und die Schleife wird unterbrochen
#
#
## Ergebnis
### Die Am Anfang des Dateinamens befindliche Zahl wird falls notwendig von Rechts mit Nullen auf vierzehn Stellen aufgefüllt
## Die eigentliche Funktion des Scriptes
for line in * ;
do
filename=$(
echo $line | sed '
:loop s/^\([1234567890]\{1,13\}\)\([^1234567890]\+.*\)$/\10\2/;t loop
'
);
echo $filename
mv $line $filename
done
|
Aber vorsicht: die Dateinamen werden ohne Wenn und aber umbenannt. Möchte man nur sehen, was wirklich passieren würde kommentiert man oben die "mv"-Zeile aus. Außerdem: Sollte die Zieldatei schon existieren, so wird diese überschrieben. Ist also noch nicht wirklich Fehlerfrei. Vielleicht kann jemand anderes ja nochmal drüber schauen, was man ändern und verbessern kann. Sers FB1
|
freebirth_one
Anmeldungsdatum: 19. Juli 2007
Beiträge: 5051
Wohnort: Mönchengladbach
|
Ok, hier eine Erweiterte Version des Scriptes; diesmal mit Fehlerbehandlung 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | for line in * ;
do
## prüfen ob dateiname mit einer Zahl beginnt. falls nein, nächste Datei
[[ $line =~ ^[0-9]+ ]] || continue;
## neuen dateinamen erstellen.
filename=$(
echo $line | sed '
:loop s/^\([1234567890]\{1,13\}\)\([^1234567890]\+.*\)$/\10\2/;t loop
'
);
echo $filename;
## Sollte der neue Dateiname schon bestehen, so wird die führende Zahl darin sukkzessive inkrementiert
while [ -f $filename ] ;
do
ZAHLEN=$(echo $filename | cut -c 1-14 );
REST=$(echo $filename | cut -c 15-);
echo "zahlen=$ZAHLEN, Rest=$REST";
let ZAHLEN+=1; filename=$ZAHLEN$REST;
echo $filename;
done;
## Datei verschieben
mv $line $filename;
done
|
Funktion siehe Script im vorherigen Post
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
Oh, das ging jetzt aber unglaublich schnell! ☺
...
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
... Vielen herzlichen Dank, ich habe es ausprobiert und auf den ersten Blick schien alles wunderbar, als ich aber das skript ein zweites mal über einen Ordner laufen lies, stellte ich fest, dass alle Dateinamen die bereits perfekt waren nochmal um eins erhöht wurden. ☹ Es scheint also ein kleiner Käfer die Dateinamen, die bereits mit 14 Stellen in Ordnung sind nicht in Ruhe zu lassen, sondern um eins zu erhöhen. So wird auch bei der ersten Benutzung des Skripts bereits aus dem Dateinamen 20131220172021.jpg, der eigentlich so bleiben sollte, durch das skript: 20131220172022.jpg Liese sich das evtl. noch korrigieren? Auf jeden Fall noch einmal vielen Dank für die Mühe und schnelle Hilfe, einen wunderschönen Tag, michael
|
HarzG
Anmeldungsdatum: 24. Dezember 2009
Beiträge: 452
|
Es geht auch mit der Funktionstaste F2 in Thunar. Dabei kann man Datum/Zeit im Dateinamen hinzufügen. Dateien auswählen, F2 drücken, (anstatt Suchen/Ersetzen) Datum/Uhrzeit einfügen, wählen ob man Systemzeit, Zugriff, Änderung oder Aufnahme einfügen will.
- Bilder
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
HarzG schrieb: Dateien auswählen, F2 drücken, (anstatt Suchen/Ersetzen) Datum/Uhrzeit einfügen, wählen ob man Systemzeit, Zugriff, Änderung oder Aufnahme einfügen will.
Wie bereits geschrieben, nützt mir das nichts, da die Dateien bereits ein relevantes Datum im Dateinamen haben, das (zu) oft nicht durch "Systemzeit, Zugriff, Änderung oder Aufnahme"-Datum ersetzt werden kann. (Bsp. Geänderte Bilder ohne Exif-Daten, später erstellte Textdateien, Videos/Bilder bei denen die Kamerazeit falsch eingestellt war, ...) Trotzdem vielen Dank für den Versuch, vielleicht nützt es ja jemand anders der durch eine Suchanfrage hierher kam... michael
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
Einen wunderschönen guten Tag, nach einem weiteren Test nochmal kurz: was jetzt als letztes fehlt wäre z.B. die Bedingung: ## prüfen ob Dateiname bereits 14 Ziffern am Anfang hat: falls ja, nächste Datei Falls es dafür noch eine einfache Zeile gibt, wäre ich sehr dankbar über einen Hinweis. Vielen Dank, michael
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Nicht sehr elegant, aber ...
| case $foo in
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*) echo 14 digits ;;
*) echo alles sonst ;;
esac
|
when in doubt, use brute force.
|
michaelsf
(Themenstarter)
Anmeldungsdatum: 15. Januar 2014
Beiträge: 24
|
Vielen Dank! Ich kenn mich damit zwar nicht aus, aber ich hab es jetzt mal ungefähr so eingebaut und es scheint in dieser Form (siehe Anhang) nun perfekt zu funktionieren... Herzlichen Dank noch einmal!
- ZiffernNamenErweitern.sh (3.0 KiB)
- Download ZiffernNamenErweitern.sh
|