seahawk1986 schrieb:
Der Ansatz mit find sortiert dann aber die Dateien dann aber nicht wie ls -rt
(da kommen die zuletzt bearbeiteten Dateien zuerst), sondern alphabetisch.
Bei ls -rt
kommen die ältesten Dateien zuerst. Die Option "-r" dreht die Reihenfolge um, und "-t" liefert zuerst die neuesten.
Ich glaube, wir müssen das mal in die Gebote mit aufnehmen:
Du sollst die Ausgabe von ls
nicht parsen!
Ich stimme zu, dass so etwas in Python oder Ruby einfacher ist. Hier nochmal eine Lösung mit der Shell:
| stat --printf '%Y %n\0' *.jpg | sort -zn | sed -z 's#^[0-9]* ##' | xargs -r0 sh -c 'a=1; for i; do new=$(printf "renamed/%04d.jpg" $a); echo cp "$i" "$new"; a=$((a+2)); done' --
|
Oder, etwas netter formatiert:
1
2
3
4
5
6
7
8
9
10
11
12 | stat --printf '%Y %n\0' *.jpg \
| sort -zn \
| sed -z 's#^[0-9]* ##' \
| xargs -r0 sh -c '
a=1
for i; do
new=$(printf "renamed/%04d.jpg" $a)
echo cp "$i" "$new"
a=$((a+2))
done
' --
|
Und: das läuft auch in der sh
- man braucht keine bash
dafür. Und das echo
muss nach dem Testen natürlich raus.
Einziger Schönheitsfehler: wenn die Dateiliste richtig lang wird, dann passen nicht alle Dateinamen in eine Kommandozeile von sh
und xargs
startet die sh
mehr als ein Mal. Man könnte das noch zumindest über eine Fehlererkennung einbauen, d.h., abbrechen, wenn $new auf eine Datei zeigt, die es schon gibt.