2009-08-21 5 views
1

In den letzten Jahren habe ich verschiedene Arten von Software, um meine Foto- und Musiksammlungen zu organisieren. Dies hat zu Unterschieden in der Verzeichnisstruktur geführt, und ich möchte, dass dies einheitlich ist.Ordner mit einem Skript neu organisieren

Problem ein: Musik Sammlung

ich meine Musiksammlung wollen wie folgt aussehen: /Artist/Album/files.*
aber jetzt gibt es mehrere Instanzen von /A/Artist/Album/files.*

Ich versuche, ein Skript zu schreiben, die:
1. Suchen Sie alle Ordner mit 1 Zeichen,
2. Verschieben Sie den Inhalt jedes Ein-Zeichen-Ordners nach/Artist/
(Struktur abflachen und verarbeiten in Dateinamen Leerzeichen)

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 | mv * ./Artists/ 

Ruft halb mich, aber es Leerzeichen in Verzeichnisnamen nicht verarbeitet, und ich bin ein wenig unsicher, ob es andere Tücken.

Problem b: Fotosammlung

ich hier eine sehr ähnliche Situation haben, sieht die meisten meiner Sammlung wie ich es will. Wunsch:
/Fotos/2009/2009-08-07 Beschreibung/filename.jpg

aktuelle Situation:
/Photos/2009/03/21/filename.jpg

Ich brauche ein Skript, das :
1. alle Ordner finden, die Übereinstimmung/yyyy/mm/dd/
2. Bewegen Inhalt/yyyy-mm-dd/
3. alten Ordner

Hintergrund löschen

Ich glaube, ein Bash-Skript wäre gut geeignet, aber ich bin auch bereit für etwas in Python.
Ich benutze Ubuntu 9.04.

Vielen Dank im Voraus.

Antwort

0

Für Ihre zweite Anfrage, versuchen, etwas wie folgt aus:

#!/bin/bash 
find $PHOTO_DIR -regextype posix-extended -type d -regex '.*/[0-9]{4}/[0-9]{2}/[0-9]{2}$' | 
while read dir; do 
    newdir="$(echo $dir | sed '[email protected]/\([0-9]\{4\}\)/\([0-9]\{2\}\)/\([0-9]\{2\}\)[email protected]/\1-\2-\[email protected]')" 
    mv "$dir" "$newdir" 
    rmdir "$(dirname $dir)" 
    rmdir "$(dirname $(dirname $dir))" 
done 

Das für meine einfachen Testfall gut funktioniert; Um sicherzustellen, dass es für Sie richtig funktioniert, stellen Sie eine echo vor die drei Aktionslinien (mv und zweimal rmdir).

Als wenig allgemeinen Beratung, Ausgabe der Rohrleitungen finden in eine while read Schleife ist nicht nur für Skripte - es ist eine sehr leistungsfähige Einzeiler Technik für über find ‚s -exec Fähigkeit geht.

0

Ich habe ein einfaches Python-Skript. Obwohl Ihr Fall sehr spezifisch ist, ziehe ich es vor, Fotos in separate Ordner zu verschieben, indem Sie deren EXIF-Informationen betrachten. Es kopiert Fotos von SRC zu DST, wo es einen Ordner für jeden Tag erstellt. Es verwendet EXIF.py. Also hier geht es:

import EXIF, os, re, shutil, sys 

__date__ ="$Jun 4, 2009 1:27:16 PM$" 

if __name__ == "__main__": 
    if len(sys.argv) < 3: 
     print "No params given. PhotoDispatcher.py <SRC> <DST>" 
     exit(1) 
    src = sys.argv[1] 
    dst = sys.argv[2] 
    for path, directories, files in os.walk(src): 
     for filename in files: 
     curfile = src+'/'+filename 
      f = open(curfile, 'rb'); 
     tags = EXIF.process_file(f, stop_tag='EXIF DateTimeOriginal') 
    f.close() 
     try: dateTimeOrig = tags['EXIF DateTimeOriginal'].__str__()[0:10] 
    except KeyError: 
     print "unable to read DateTimeOriginal tag", filename 
     continue 
     dirName = re.sub(':','.', dateTimeOrig) 
     newdir = dst+'/'+dirName 
    try: os.mkdir(newdir) 
    except os.error: 
     print "unable to create directory: ", os.error 
     newfile = newdir+'/'+filename 
    print curfile, '-->', newfile 
     shutil.move(curfile, newfile) 
1

Versuchen Sie es.

Übergeben der Ausgabe von Find verliert die Unterscheidung zwischen Leerzeichen in Dateinamen und separaten Dateien. -exec führt mv für jede gefundene Datei nacheinander aus. -ok macht dasselbe, fragt dich aber zuerst nach Bestätigung.

0

Mit find's -print0 und xargs '-0 können Leerzeichen behandelt werden.

Probieren Sie etwas wie:

find [A-Z]/* -type d -maxdepth 1 -mindepth 1 -print0 \ 
| xargs -r0 -I'{}' mv {} Artists/ 
Verwandte Themen