ubuntuusers.de

Dateien anhand des Namens verschieben

Status: Ungelöst | Ubuntu-Version: Ubuntu 13.04 (Raring Ringtail)
Antworten |

pyriander

Avatar von pyriander

Anmeldungsdatum:
20. Mai 2008

Beiträge: 119

Wohnort: da wo's dauernd regnet

Hallo, ich hab eine recht große Fotosammlung, die ich nun neu sortieren will. Bisher sind alle Bilder in Unterordnern nach Aufnahmetag sortiert. Die Struktur der Ordner ist folgende: JJJJ_MM_TT. Die Struktur der Dateinamen in den Unterordnern ist JJJJMMTT_<fortlaufende 4-stellige Nummer>. In der neuen Struktur sollen die Dateinamen erhalten bleiben, die Bilder sollen aber nur noch nach Monat sortiert werden, also alle Bilder des Monats 05 landen zusammen in einem Ordner 2013_05.

Ich würd das gerne automatisieren, bin mit der Bash allerdings nicht so firm, dass ich da mal grad ein Script für schreiben könnte. Daher hier die Frage, geht das mit einem Shell-Script überhaupt und wenn ja, kann mir einer dabei helfen so eines zu schreiben?

Danke im voraus, pyri

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

schön ist, dass in den Dateinamen die Datumsinformation nochmal drinsteht. Dann braucht man im Prinzip nur über alle Bilddateien iterieren, das gewünschte Datum aus dem Namen extrahieren und die Datei dorthin kopieren.

Angenommen, deine Verzeichnisse liegen in „~/pic“ (also „~/pic/2013_03/20130314_1234.jpg“ oder ähnlich):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# Zielverzeichnis für die neue Struktur:
target=/tmp/pic

for i in ~/pic/*/*
do
    # Nur der reine Dateiname ohne führende Verzeichnisse
    # kommt in $bn:
    bn=$(basename "$i")

    # Extrahiere daraus Jahr und Monat:
    # (siehe http://mywiki.wooledge.org/BashFAQ/073)
    prefix="$target/${bn:0:4}_${bn:4:2}"

    # Erstelle das Zielverzeichnis (wenn schon da, ist's egal)
    # und kopiere die Datei:
    mkdir -p "$prefix"
    cp -avi "$i" "$prefix"
done

(Beachte, dass „/tmp“ bei dir vielleicht ein tmpfs sein kann und eventuell nicht genug Platz hat für alle Bilder. Kontrolliere es vorher mit „df -h“.)

senden9

Avatar von senden9

Anmeldungsdatum:
8. Februar 2010

Beiträge: 965

Wohnort: Österreich

Ich hätte noch eine Pythonlösung. srcdir ist der original Ort. destdir ist das Ziel. Es werden alle Dateien kopiert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env python2.7
import os
import re
import shutil

srcdir = "/tmp/hier_sind_die_bilder/"
destdir = "/tmp/hier_sollen_sie_hin/"

dirs = [f for f in os.listdir(srcdir) if re.search(r'[0-9]{4}_[0-9]{2}_[0-9]{2}$', f)] #Ordner im Format dddd_dd_dd

for ordner in dirs:
    underdestdir = destdir+ordner[:-3]
    if (os.path.exists(underdestdir) == False): os.makedirs(underdestdir)
    print os.path.join(srcdir, ordner) + " - nach - " + underdestdir
    for bild in os.listdir(os.path.join(srcdir,ordner)):
        shutil.copy(os.path.join(srcdir, ordner, bild), os.path.join(underdestdir, bild))

MfG

pyriander

(Themenstarter)
Avatar von pyriander

Anmeldungsdatum:
20. Mai 2008

Beiträge: 119

Wohnort: da wo's dauernd regnet

Super, danke! Werd das morgen mal ausprobieren!

pyriander

(Themenstarter)
Avatar von pyriander

Anmeldungsdatum:
20. Mai 2008

Beiträge: 119

Wohnort: da wo's dauernd regnet

So, beide Scripte hab ich ausprobiert. Auch wenn ich das Bash-Script besser nachvollziehen kann, funktioniert es nicht. Ich bekomm von der Bash ein "Bad Substitution" zurück. Das Python-Script hingegen funktioniert einwandfrei.

Trotzdem besten Dank an senden9 und Vain für die Hilfe!!

Grüße, Pyri

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

pyriander schrieb:

Ich bekomm von der Bash ein "Bad Substitution" zurück.

(Vielleicht hast du es mit „sh skriptname“ aufgerufen und damit mit der Dash. Dann kommt das. Ansonsten keine Ahnung, in meinen Tests hat es gut funktioniert. Aber wenn dein Problem gelöst ist, soll’s mir recht sein. ☺)

pyriander

(Themenstarter)
Avatar von pyriander

Anmeldungsdatum:
20. Mai 2008

Beiträge: 119

Wohnort: da wo's dauernd regnet

Habs glaub ich mit ./script.sh aufgerufen... aber ich werds nochmal teste 😉

Antworten |